BSTR.FUNC.REALLOC

对 BSTR 重新分配函数的错误调用

BSTR.FUNC.REALLOC 检查器会查找对 BSTR 重新分配函数 SysReAllocString 或 SysReAllocStringLen 的错误调用。函数的第一个参数应为指向 BSTR 实体的指针,第二个参数应为宽字符串。如果函数的第一个参数错误,或将 BSTR 类型的值指定为该函数的第二个参数,Klocwork 将标记相应代码。

漏洞与风险

由于两种样式的构建方式不同,将 COM 样式 BSTR 字符串与 C 样式字符串相互转换时需谨慎。在某些情况下,两者之间的转换可正常编译,但仍会产生意外结果。

缓解与预防

与 C 样式字符串不同,BSTR 字符串具有长度为 4 个字节,并包含以下数据字符串中的字节数的前缀。此外,BSTR 字符串还包含非强类型的嵌入式 null 字符。出于这些原因,最好不要在新设计中使用 BSTR。对于现有接口,请务必谨慎进行转换和使用 Sys*Alloc*、SysFree* 和 *String* 内存分配函数。

漏洞代码示例

复制
  void bstr_realloc(wchar_t *ws, BSTR bstr1, BSTR bstr2) {
    SysReAllocString(&ws, L"abc"); 
    SysReAllocString(&bstr1, bstr2);  
  }

Klocwork 标记了本示例的第 2 行和第 3 行。如果已为第二个参数指定错误类型的值,Klocwork 将不会标记相应语句,因为编译器通常会捕获该错误,但是在本示例的第 2 行中,已将 BSTR 类型的值指定为第一个参数,该参数可通过编译器,然后导致意外结果。在第 3 行中,第二个参数为 BSTR 类型的值,因此长度前缀被视为该字符串值的一部分,并可能导致意外的程序操作。