BSTR.FUNC.ALLOC

对 BSTR 分配函数的错误调用

当 BSTR 类型的值指定为函数的参数时,BSTR.FUNC.ALLOC 检查器会查找对 BSTR 分配函数 SysAllocString 和 SysAllocStringLen 的调用。

漏洞与风险

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

缓解与预防

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

漏洞代码示例

复制
  void bstr_alloc() {
    BSTR foo = SysAllocString(L"abc"), bar;
    bar = SysAllocString(foo);  
  }

Klocwork 标记了本示例中的第 3 行。SysAllocString 将其参数视为以 null 终止的普通 C 字符串,因此 BSTR 字符串中的任何嵌入式 null 字符均可导致此函数出现问题。SysAllocString 使用 BSTR 变量生成的短字符串可导致意外后果。

修正代码示例

复制
  void bstr_alloc() {
    BSTR foo = SysAllocString(L"abc"), bar;
    bar = foo; 
    SysFreeString(bar)   
  }

在该修正代码示例中,SysAllocString 已从第 3 行中删除,此外,已使用正确的 SysFreeString 函数释放内存。