aBSTRはコードベースのaにすぎないtypedefためwchar_t*、文字列リテラルがメソッドに渡される場所がいくつか(多く?)あります。BSTRこれは、マーシャラーや特定のメソッドを使用しようとする人BSTR(たとえばSysStringLen)を混乱させる可能性があります。
このタイプの誤用を静的に検出する方法はありますか?
/WallVC10と静的コード分析のMicrosoftAllRulesを使用してコンパイルしようとしましたが、次の問題のあるコードはどちらからもフラグが付けられません。
void foo(BSTR str)
{
std::cout << SysStringLen(str) << std::endl;
}
int _tmain()
{
foo(L"Don't do that");
}
更新:wtypes.h私が諦めたこれらの種類の違反を検出するために破壊しようとした後。
2つのパスを試しましたが、どちらも上記のサンプルプログラムで作業することができましたが、実際のプロジェクトを試すと失敗しました。
- 名前の付いたクラスを作成します
BSTRが、はユニオンメンバーとしてをVARIANT持っているBSTRため、新しいクラスにはコンストラクターや代入演算子を含めることができませんでした。これはすべての場所で壊れ、NULLとして扱われましたBSTR。変換演算子を持つ型に置き換えようとしましNULLたが、数十の新しい演算子(比較、変換など)を追加した後、あいまいな呼び出しに遭遇し、あきらめました。 - 次に、@ CashCowと@Hansによって提案された方法を試しました(
BSTR別typedefのタイプのポインターを作成します)。これも機能しませんでした。メソッドを追加toBSTRし、comutil.h()やその他の場所を変換して散らかした後、コンパイラがIDLから生成されたヘッダーをチョークするようになりました(デフォルト値はリテラル幅の文字列に変換されます)。fromBSTR_bstr_t
要するに、私は自分でこれを達成しようとすることをあきらめました。誰かがそれについて聞くのを助けることができるコード分析ツールを知っているなら、私はそれについて聞いてとてもうれしいです。