0

Microsoft の SAL (Source Annotation Language) は良いものだという考えにたどり着き、その言語とアノテーション プロパティの意味を調べました。

「 int」パラメータに関連する SAL の「 Deref」プロパティの使用について一般的な質問があります。Visual Studio 10 を実行している ctype.h インクルード ファイルから取得した isalpha() 関数の SAL を使用して、私の質問を説明しましょう。

[戻り値:SA_Post(MustCheck=SA_Yes)] int __cdecl isalpha([SA_Pre(Null=SA_No)] [SA_Pre(Deref=1,Valid=SA_Yes,Access=SA_Read)] int _C);

単一のパラメーター _C が「int」の場合、「[SA_Pre( Deref =1 ,Valid=SA_Yes,Access=SA_Read)]」は何を意味しますか? int を 1 回 (Deref=1) 意味のある方法で逆参照するにはどうすればよいですか?

私が考えることができる唯一の説明は、整数がctypeの内部バイト配列への参照であると注釈が述べているということです。静的アナライザーはこの注釈をどのように利用できるでしょうか?

4

1 に答える 1

1

isalpha 宣言の前処理バージョンを貼り付けたように見えます。ctype.h に表示されるのは次のとおりです。

_Check_return_ _CRT_JIT_INTRINSIC _CRTIMP int __cdecl isalpha(_In_ int _C);

_In_開発者がパラメーターが厳密に入力パラメーターであることを明示的に表現できるようにするために、スカラー パラメーター (int など) で使用できます。これは一種の冗長ですが、それでも当てはまります (結局のところ、値渡しスカラーを介して値を返すことはできません)。

注釈は、入力ポインター_In_のセマンティクスを表現するために、上で貼り付けたように展開されるマクロです。int では Null も Deref=1 もあまり意味がないため、静的アナライザーは がスカラー パラメーターに適用されていることを認識し、それを無視します。_In_

他のコンテキストでは、_In_注釈の一部である以外に、int の Deref=1 は意味がありません。

_In_このような基本的な実装の詳細を本当に調べたい場合を除き、SA_Pre および SA_Post よりも -style 構文を使用する方が一般的には優れています。

于 2011-11-25T05:30:24.043 に答える