用于检测将wchar_t*传递给BSTR的静态代码分析

Mot*_*tti 13 c++ bstr visual-c++ static-code-analysis

由于BSTR只是typedefwchar_t*我们的代码库,其中字符串文字传递给方法的几个(许多?)的地方期待BSTR这可以胡来了marshallers或任何人谁尝试使用任何BSTR特定的方法(比如SysStringLen).

有没有办法静态检测这种滥用?

我尝试使用VC10 /Wall和静态代码分析Microsoft All Rules进行编译,但是以下任何一个代码都没有被其中任何一个标记.

void foo(BSTR str)  
{
    std::cout << SysStringLen(str) << std::endl; 
}

int _tmain()
{
    foo(L"Don't do that");
}
Run Code Online (Sandbox Code Playgroud)

更新:在试图破坏wtypes.h我已经放弃的这些违法行为之后.

我尝试了两条路径,这两条路径都是我上面的示例程序,但是一旦我尝试了一个真正的项目,它们就失败了.

  1. 创建一个名为BSTR但是由于一个VARIANT有一个BSTR联合成员的类,新类不能有任何构造函数或赋值运算符,这个被破坏的每个地方都NULL被视为一个BSTR.我尝试NULL用具有转换运算符的类型替换但在添加了几十个新运算符(比较,转换等)之后,我开始遇到模糊的调用而放弃了.
  2. 然后我尝试了@CashCow和@Hans建议的方式(BSTR使用typedef另一种类型的指针).这也没有用,在添加toBSTRfromBSTR乱丢comutil.h(_bstr_t)和其他转换的地方之后,我终于到了编译器在IDL生成的标题处被阻塞的点(默认值被转换为文字宽字符串).

总之,如果有人知道一个代码分析工具可以帮助我很高兴听到它,我已经放弃了尝试自己实现这个目标.

i_a*_*orf 4

我相信Coverity声称可以检测此类漏洞。我记得他们在向我工作的公司演示时特别提到了 COM 的东西。

他们的数据表似乎暗示他们会检查 BSTR 使用不当的类别。他们有一个演示期;您可以尝试一下,看看它是否标记了您的示例输入。