strict_gs_check pragma

この pragma は、強化されたセキュリティ チェックを提供します。

構文


#pragma strict_gs_check( pop )

解説

コンパイラが関数スタックにランダム クッキーを挿入し、スタック ベースのバッファー オーバーランのカテゴリの検出に役立つように指示します。 既定では、/GS コンパイラ オプションは、すべての関数に対して Cookie を挿入しません。 詳細については、「/GS (バッファーのセキュリティ チェック)」を参照してください。

/GS を使用して strict_gs_check を有効にするためにコンパイルします。

この pragma は、有害なデータに対して公開される可能性があるコード モジュールで使用してください。 strict_gs_check はアグレッシブな pragma です。この防御を必要としない可能性があり、ただし生成アプリケーションのパフォーマンスに対する影響を最小化するために最適化された関数に適用されます。

この pragma を使用した場合でも、安全なコードを記述する必要があります。 つまり、コードにバッファー オーバーランが含されていないことを確認します。 strict_gs_check は、コードに残っているバッファー オーバーランからアプリケーションを保護する場合があります。

このサンプルでは、ローカル配列に配列をコピーすると、バッファー オーバーランが発生します。 /GS でこのコードをコンパイルした場合、配列のデータ型はポインターであるため、スタックにクッキーが挿入されません。 strict_gs_checkpragma を追加すると、スタック Cookie が関数スタックに強制的に追加されます。

// 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;
}

関連項目

pragma ディレクティブと __pragma および _Pragma キーワード
/GS (バッファーのセキュリティ チェック)