_In_
および_Out_
(注:_in_/_out
あなたが書いたように_も、__In__/__Out__
他の回答で書かれたように二重アンダースコアも付けない)は、いわゆるSAL注釈です。これらは/analyze
コンパイラオプションとともに使用でき、生のCバッファとポインタでのバッファオーバーランなどのバグや問題を特定するのに役立ちます。SALに関するMSDNドキュメントに加えて、このブログ投稿も読むことができます。
皮肉なことに(そして間違って)誰かがそれを書いた:
「他の世界では、入力はconstポインターですが、それは単純すぎると思います。:)」
SALがそれよりも強力であるという事実を見逃しています。実際、SALを使用すると、宛先バッファーの最大サイズを指定して、宛先バッファーのサイズが含まれているパラメーターを指定することもできます。たとえば、ヘッダーを開くと、 (のUnicodeバージョン)に<strsafe.h>
使用される実際のSALアノテーションは次のようになっていることがわかります。StringCbPrintfW
StringCbPrintf
STRSAFEAPI
StringCbPrintfW(
__out_bcount(cbDest) STRSAFE_LPWSTR pszDest,
__in size_t cbDest,
__in __format_string STRSAFE_LPCWSTR pszFormat,
...)
{
....
__out_bcount(cbDest)
パラメーターに適用されたSALアノテーションが、これが出力バッファー()pszDest
へのポインターであることをどのように指定しているかに注意してください。サイズはパラメーターによってバイト()で表されます。ご覧のとおり、これは豊富な注釈です(単純な「」または「非」よりも豊富です)。__out
_bcount
cbDest
const
const
私の意見では、SALは、独自のサイズなどを知っている、などの堅牢なコンテナクラスを使用してC ++コードを作成する場合は役に立たないです。しかし、SALは、生のポインタを使用するC風のコード(いくつかのWin32 APIなど)で役立ちstd::vector
ます。std::string
あなたの質問の2番目の部分について:
StringCbPrintf
「すでに持っているのになぜ必要なのかsprintf
」
主な理由はsprintf
、安全ではなく、バッファオーバーランが発生しやすい関数であるということです。代わりにStringCbPrintf
、宛先バッファの最大サイズを指定する必要があります。これにより、バッファオーバーラン(セキュリティの敵)を防ぐことができます。