由于
更新:尝试篡改
我尝试了两种方法,两种方法在我的示例程序中都能够工作,但一旦我尝试一个真实项目,它们就失败了。
1.创建一个名为
2.然后我尝试了@CashCow和@Hans建议的方法(将
简而言之,我放弃了自己尝试实现这一点,如果有人知道可以帮助的代码分析工具,我会非常高兴听到它。
BSTR
只是 wchar_t*
的一个 typedef
,我们的代码库中有很多地方将字符串字面值传递给期望 BSTR
的方法,这可能会影响到编组器或任何试图使用任何 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");
}
更新:尝试篡改
wtypes.h
以检测这些违规行为后,我放弃了。我尝试了两种方法,两种方法在我的示例程序中都能够工作,但一旦我尝试一个真实项目,它们就失败了。
1.创建一个名为
BSTR
的类,但由于VARIANT
具有BSTR
作为联合成员,所以新类不能有任何构造函数或赋值运算符,这破坏了每个将NULL
视为BSTR
的地方。我试图用具有转换运算符的类型替换NULL
,但是在添加了几十个新运算符(比较、转换等)之后,我开始遇到模棱两可的调用,然后放弃了。2.然后我尝试了@CashCow和@Hans建议的方法(将
BSTR
作为指针的另一种类型的typedef
)。那也不起作用,在将toBSTR
和fromBSTR
方法添加到comutil.h(_bstr_t
)和其他地方,并将转换散布其中之后,编译器最终卡在从IDL产生的头文件处(默认值被转换为文字宽字符串)。简而言之,我放弃了自己尝试实现这一点,如果有人知道可以帮助的代码分析工具,我会非常高兴听到它。
SysStringLen
要寻找的内容),这就是为什么将wchar_t *
视为BSTR
是不正确的原因。 - Mottitypedef enum class BSTRchar : wchar_t {} *BSTR;
也不起作用... 带作用域的枚举没有隐式向上转换。 - Ben Voigt