14
Since a BSTR is only a typedef for wchar_t* our code base has several (many?) places where string literals are passed to a method expecting a BSTR this can mess up with marshallers or anyone who tries to use any BSTR specific method (e.g. SysStringLen).
Is there any way to statically detect this type of misuse?
I tried compiling with VC10 /Wall and with static code analysis Microsoft All Rules but the following offending piece of code doesn't get flagged by either of them.
void foo(BSTR str)
{
std::cout << SysStringLen(str) << std::endl;
}
int _tmain()
{
foo(L"Don't do that");
}
Update: After trying to vandalize wtypes.h into detecting these kinds of transgressions I've given up.
I tried two paths, both of which I got to work with my sample program above but once I tried a real project they failed.
- create a class named
BSTRbut since aVARIANThas aBSTRas a union member the new class couldn't have any constructors or assignment operators this broke every place wereNULLwas treated as aBSTR. I tried to replaceNULLwith a type that has conversion operators but after adding dozens of new operators (comparison, conversion etc.) I started to run into ambiguous calls and gave up. - I then tried the way suggested by @CashCow and @Hans (makeing
BSTRatypedefto another type of pointer). That didn't work either, after addingtoBSTRandfromBSTRmethods and littering comutil.h (_bstr_t) and other places with conversions I finally got to the point where the compiler choked at headers produced from IDLs (default values are translated to literal wide strings).