由于BSTR只是typedefwchar_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替换为具有转换运算符的类型,但是在添加了数十个新运算符(比较,转换等)之后,我开始遇到模棱两可的调用并放弃了。
  • 然后,我尝试了@CashCow和@Hans建议的方法(使BSTR成为另一种指针的typedef)。在添加了toBSTRfromBSTR方法并在comutil.h(_bstr_t)和其他地方添加了转换之后,我最终也到达了编译器阻塞由IDL生成的 header 的位置(默认值被转换为文字宽字符串) )。

  • 简而言之,如果有人知道一个可以提供帮助的代码分析工具,我会很高兴听到我的消息,而我已经放弃了独自实现这一目标的尝试。

    最佳答案

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

    他们的datasheet似乎暗示他们正在检查BSTR使用不正确的类。他们有一个演示期。您可以尝试一下,看看它是否标记了您的示例输入。

    关于c++ - 静态代码分析,用于检测将wchar_t *传递给BSTR,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8986115/

    10-12 03:42