safebuffers
Microsoft 固有の仕様 →
コンパイラが関数のバッファー オーバーランのセキュリティ チェックを挿入します。
__declspec( safebuffers )
解説
/GS コンパイラ オプションはコンパイラがスタックのセキュリティ チェックを挿入してバッファー オーバーランをテストします。セキュリティ チェックの対象となるデータ構造体の型は /GS (バッファーのセキュリティ チェック) に示します。バッファー オーバーランの検出についてはCompiler Security Checks In Depth MSDN Web サイトの " " を参照してください。
巧妙な手動のコード レビューまたは外部の解析は関数のバッファー オーバーランから安全であると判断する場合もあります。この場合関数宣言に declspec(safebuffers) のキーワードを適用して関数のセキュリティ チェックを抑制できます。
注意 |
---|
バッファーのセキュリティ チェックがある機密性について説明しパフォーマンスのほとんど影響があります。したがってそれらを抑制することをお勧めして関数のパフォーマンスが重要な問題である関数が安全であることがわかっているような場合を除きます)。 |
インライン関数
主要な機能は その関数 のコピーを挿入するために インライン展開 のキーワードを使用します。の declspec(safebuffers) のキーワードが関数に適用されている場合バッファー オーバーランの検出はその関数のように制約されます。ただしインライン展開はの declspec(safebuffers) のキーワードに次のように影響します。
/GS コンパイラ オプションを両方の関数に対して指定されていますが主要な機能が declspec(safebuffers) のキーワードを指定するとします。セカンダリ関数のデータ構造はセキュリティ チェックの対象となるように関数はのチェックが表示されなくなります。この場合、結果は次のようになります。
インラインにコンパイラを強制する 2 関数で __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 固有の仕様→