aBSTR
はコードベースのaにすぎないtypedef
ためwchar_t*
、文字列リテラルがメソッドに渡される場所がいくつか(多く?)あります。BSTR
これは、マーシャラーや特定のメソッドを使用しようとする人BSTR
(たとえばSysStringLen
)を混乱させる可能性があります。
このタイプの誤用を静的に検出する方法はありますか?
/Wall
VC10と静的コード分析の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
要するに、私は自分でこれを達成しようとすることをあきらめました。誰かがそれについて聞くのを助けることができるコード分析ツールを知っているなら、私はそれについて聞いてとてもうれしいです。