BSTR.FUNC.LEN

尝试使用 BSTR 函数获取非 BSTR 字符串的长度

BSTR.FUNCL.LEN 检查器会查找尝试获取非 BSTR 字符串的长度时使用的 SysStringLen 或 SysStringByteLen 函数。这些函数的唯一参数应为 BSTR 类型的值。

漏洞与风险

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

缓解与预防

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

如果第一个宽字符串不包含长度前缀,可能出现意外结果。

漏洞代码示例

复制
  void bstr_len(wchar_t *a) {
    int l = SysStringLen(a);
  }

Klocwork 标记了第 2 行,该行中的 SysStringLen 函数使用方式不正确。SysStringLen 期望 BSTR 长度前缀包含在变量中,因此将其用于非 BSTR 变量将导致意外结果。