BSTR.OPS.EQS

错误的 BSTR 值相等比较

BSTR.OPS.COMP 检查器会查找使用 BSTR 实体进行相等比较的实例。不能使用 BSTR 值进行相等比较运算,因为它们在 BSTR 上下文中无任何意义,并且如果未经更正,可导致内存使用错误。

漏洞与风险

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

缓解与预防

与 C 样式字符串不同,BSTR 字符串具有长度为 4 个字节,并包含以下数据字符串中的字节数的前缀。此外,BSTR 字符串还包含非强类型的嵌入式 null 字符。出于这些原因,最好不要在新设计中使用 BSTR。

漏洞代码示例

复制
  void bstr_eqs() {
       BSTR foo;
       wchar_t *bar = L"abc";
       if (foo != bar) 
               bar = NULL; 
  }

Klocwork 标记了第 4 行,该行中尝试使用 BSTR 值进行相等比较运算。

相关检查器