BSTR.FUNC.FREE
对 BSTR 释放函数的错误调用
BSTR.FUNC.ALLOC 检查器会查找对 BSTR 释放函数 SysFreeString 的错误调用。此函数的唯一参数应为 BSTR 类型的值。
漏洞与风险
由于两种样式的构建方式不同,将 COM 样式 BSTR 字符串与 C 样式字符串相互转换时需谨慎。在某些情况下,两者之间的转换可正常编译,但仍会产生意外结果。
将 BSTR 释放字符串与非 BSTR 参数一起使用可导致内存使用问题。
缓解与预防
与 C 样式字符串不同,BSTR 字符串具有长度为 4 个字节,并包含以下数据字符串中的字节数的前缀。此外,BSTR 字符串还包含非强类型的嵌入式 null 字符。出于这些原因,最好不要在新设计中使用 BSTR。对于现有接口,请务必谨慎进行转换和使用 Sys*Alloc*、SysFree* 和 *String* 内存分配函数。
漏洞代码示例
复制
void bstr_free(wchar_t *s){
SysFreeString(s);
}
Klocwork 标记了第 2 行,因为期望获得 BSTR 变量结构的 SysFreeString 函数已用于变量 wchar。这种使用方式可导致内存分配问题。