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
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示