BSTR.CAST.C

转换为 BSTR 的错误 C 样式类型

BSTR.CAST.C 检查器可查找到已被显式转换为 BSTR 表达式的 C 样式表达式。

漏洞与风险

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

将非 BSTR 指针转换为 BSTR 类型可能导致内存使用问题。

缓解与预防

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

漏洞代码示例

复制
  void bstr_cast_c() {
    wchar_t *foo = L"abc";
    BSTR bar = (BSTR)foo; 
  }

Klocwork 标记了第 3 行,该行中的非 BSTR 变量 foo 转换为 BSTR 指针。

修正代码示例

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

在此修正代码示例中,我们假设变量 foo 将成为 BSTR,因此已使用正确的 SysAllocString 转换函数将其定义为 BSTR。

相关检查器