safebuffers

Microsoft 固有の仕様

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

構文

__declspec( safebuffers )

解説

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

専門家による手動コード レビューまたは外部解析によって、関数がバッファー オーバーランしないと判断される場合もあります。 その場合は、関数宣言に __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;
}

Microsoft 固有の仕様はここまで

関連項目

__declspec
キーワード
inline、__inline、__forceinline
strict_gs_check