由于BSTR
只是typedef
的wchar_t*
,因此我们的代码库有几个(很多?)位置,字符串文字会传递给需要BSTR
的方法,这可能会使编码人员或尝试使用任何BSTR
特定方法的人(例如SysStringLen
)陷入困境。
有什么方法可以静态检测这种类型的滥用?
我尝试使用VC10 /Wall
和静态代码分析进行编译。Microsoft所有规则,但是以下两个令人讨厌的代码都没有被任何一个标记。
void foo(BSTR str)
{
std::cout << SysStringLen(str) << std::endl;
}
int _tmain()
{
foo(L"Don't do that");
}
更新:在尝试破坏
wtypes.h
以检测到这些违规行为后,我放弃了。我尝试了两条路径,上面的示例程序都使用了这两种路径,但是一旦我尝试了真实的项目,它们就会失败。
BSTR
的类,但是由于VARIANT
具有作为 union 成员的BSTR
,因此新类不能具有任何构造函数或赋值运算符,因此在NULL
被视为BSTR
的情况下,每个地方都出现了问题。我尝试将NULL
替换为具有转换运算符的类型,但是在添加了数十个新运算符(比较,转换等)之后,我开始遇到模棱两可的调用并放弃了。 BSTR
成为另一种指针的typedef
)。在添加了toBSTR
和fromBSTR
方法并在comutil.h(_bstr_t
)和其他地方添加了转换之后,我最终也到达了编译器阻塞由IDL生成的 header 的位置(默认值被转换为文字宽字符串) )。 简而言之,如果有人知道一个可以提供帮助的代码分析工具,我会很高兴听到我的消息,而我已经放弃了独自实现这一目标的尝试。
最佳答案
我相信Coverity声称可以检测到此类漏洞。我记得他们在向我工作过的公司进行演示时特别提到COM内容。
他们的datasheet似乎暗示他们正在检查BSTR使用不正确的类。他们有一个演示期。您可以尝试一下,看看它是否标记了您的示例输入。
关于c++ - 静态代码分析,用于检测将wchar_t *传递给BSTR,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8986115/