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 固有の仕様