次の方法で共有


safebuffers

Microsoft 固有の仕様 →

関数のバッファー オーバーラン セキュリティ チェックを挿入しないようにコンパイラに指示します。

__declspec( safebuffers )

解説

/GS コンパイラ オプションを指定すると、コンパイラは、スタック上でセキュリティ チェックを挿入してバッファー オーバーランをテストします。 セキュリティ チェックの対象になるデータ構造体の型は「/GS (バッファーのセキュリティ チェック)」で説明します。 バッファー オーバーラン検出の詳細については、MSDN Web サイトの「コンパイラ セキュリティの徹底調査」を参照してください。

専門家による手動コード レビューまたは外部解析によって、関数がバッファー オーバーランしないと判断される場合もあります。 その場合は、関数宣言に __declspec(safebuffers) キーワードを適用して、関数に対するセキュリティ チェックを抑制できます。

注意

バッファー セキュリティ チェックは重要なセキュリティ保護を提供し、パフォーマンスにはほとんど影響がありません。したがって、関数のパフォーマンスが重視され、関数が安全であることが判明しているまれなケースを除き、チェックを抑制しないことをお勧めします。

インライン関数

プライマリ関数は、inlining キーワードを使用してセカンダリ関数のコピーを挿入することができます。 __declspec(safebuffers) キーワードが関数に適用されている場合、その関数に対するバッファー オーバーランの検出は抑制されます。 ただし、インライン展開は次のように __declspec(safebuffers) キーワードに影響します。

両方の関数に /GS コンパイラ オプションが指定されているが、プライマリ関数は __declspec(safebuffers) キーワードを指定しているとします。 セカンダリ関数のデータ構造によってセキュリティ チェックの対象となり、関数はこれらのチェックを抑制しません。 この場合、結果は次のようになります。

  • コンパイラの最適化に関係なく、コンパイラがその関数をインライン展開するように強制するには、セカンダリ関数に __forceinline キーワードを指定します。

  • セカンダリ関数はセキュリティ チェックの対象になるため、セキュリティ チェックは、__declspec(safebuffers) キーワードを指定している場合でもプライマリ関数にも適用されます。

使用例

__declspec(safebuffers) キーワードの使用方法を次のコードに示します。

// compile with: /c /GS
typedef struct {
    int x[20];
} BUFFER;
static int checkBuffers() {
    BUFFER cb;
    // Use the buffer...
    return 0;
};
static __declspec(safebuffers) 
    int noCheckBuffers() {
    BUFFER ncb;
    // Use the buffer...
    return 0;
}
int wmain() {
    checkBuffers();
    noCheckBuffers();
    return 0;
}

END Microsoft 固有の仕様

参照

関連項目

__declspec

C++ キーワード

inline、__inline、__forceinline

strict_gs_check