VC++の開発に於いてSALを使う

SALとはStandard Annotation Languageの略で、現時点では、WindowsAPIの関数呼び出しの記述に使われています。

SALという言葉は知らなくてもこのようなヘッダを見たことはあるのではないでしょうか?

StringCchCopyA(
    __out_ecount(cchDest) STRSAFE_LPSTR pszDest,
    __in size_t cchDest,
    __in STRSAFE_LPCSTR(※1) pszSrc

);

赤字の部分がSALであり、VC++でコンパイルした場合、バッファオーバーフローを検出したりする事が出来ます。


現時点では、SALの解釈(/analyze)はVSTSのTeam Developerで有効になっていますが、最新のWindows SDKに付属のC++コンパイラで利用できる事を確認してます。(※2)

実際の動作については、MicrosoftにあるVSTSの記事を見た方が分かりやすいのですが、同じ事を説明してみます。

上記のStringCchCopy関数の場合

  • __out_ecount(cchDest)はpszDestにcchDestまでの文字数を書き込める

規約に反したコードを書いた場合、コンパイルを中止します。
私の2005ではこうなりました。

> cl 1.cpp /analyze

warning C6203: スタックでないバッファ ‘pszDest’ の ‘StringCchCopy’ への呼び出し内でのバッファ オーバーランです: 長さ ’15’ はバッファ サイズ ’10’ を超えています

実に分かりやすいエラーが出ました。

/analyzeで検出してくれるエラーに興味がある場合、C6000番台を調べてみると良いでしょう。このほかにも引数がオプションである事を宣言する__optや、文字列が”で終わることを前提に作成した関数である__nullterminatedなどが存在します。

余りに出来ることが多いため、ここでは全て書きませんが、「SAL」や「/analyze」で検索してみてください。Windows限定の開発では大きな力となるはずです。





※1 STRSAFE_LPSTRもマクロを展開したら・・・ってツッコミは無しで。
※2 Vista用のSDKです。確認してませんが、サポートされるのは多分一部の基本機能だけだと思います。(VSTS For Developerの価値を残す為に)



[MSDN] Header Annotations

Leave a Reply

最初のコメントを頂けますか?

更新通知を受け取る »
avatar
wpDiscuz