strict_gs_check
このプラグマは、強化されたセキュリティ チェックを提供します。
#pragma strict_gs_check([push,] on )
#pragma strict_gs_check([push,] off )
#pragma strict_gs_check(pop)
解説
コンパイラが関数スタックにランダム クッキーを挿入し、スタック ベースのバッファー オーバーランのカテゴリの検出に役立つように指示します。既定では、/GS (バッファー セキュリティ チェック) コンパイラ オプションは、すべての関数に対してクッキーを挿入しません。詳細については、「/GS (バッファーのセキュリティ チェック)」を参照してください。
strict_gs_check を有効にするには、/GS (バッファー セキュリティ チェック) でコンパイルする必要があります。
有害なデータに公開するコード モジュールでこのプラグマを使用します。このプラグマは非常に積極的かつこの方法を必要としない可能性が適用されたとき、アプリケーションのパフォーマンスに与える影響を最小限に抑えるために関数に最適化されます。
このプラグマを使用した場合でも、安全なコードを記述する必要があります。つまり、コードでバッファー オーバーランが発生していないことを確認します。strict_gs_check により、コードで発生しているバッファー オーバーランからアプリケーションを保護できる可能性があります。
使用例
次のコードでは、ローカル配列に配列をコピーすると、バッファー オーバーランが発生します。/GS でこのコードをコンパイルすると、クッキーはスタックで配列のデータ型がポインターであるため、挿入します。strict_gs_check プラグマを追加すると、関数スタックにスタック クッキーを強制します。
// pragma_strict_gs_check.cpp
// compile with: /c
#pragma strict_gs_check(on)
void ** ReverseArray(void **pData,
size_t cData)
{
// *** This buffer is subject to being overrun!! ***
void *pReversed[20];
// Reverse the array into a temporary buffer
for (size_t j = 0, i = cData; i ; --i, ++j)
// *** Possible buffer overrun!! ***
pReversed[j] = pData[i];
// Copy temporary buffer back into input/output buffer
for (size_t i = 0; i < cData ; ++i)
pData[i] = pReversed[i];
return pData;
}