/sdl (追加のセキュリティ チェックの有効化)
推奨される Security Development Lifecycle (SDL) のチェックを有効にします。 これらのチェックにより、セキュリティ関連の警告がエラーに変更され、追加の安全なコード生成機能が設定されます。
構文
/sdl
[-
]
解説
/sdl を指定すると、/GS
で提供されるベースライン セキュリティ チェックのスーパーセットが有効になり、/GS-
がオーバーライドされます。 既定では、/sdl
はオフになっています。 /sdl-
を指定すると、追加のセキュリティ チェックが無効になります。
コンパイル時のチェック
/sdl
では、次の警告がエラーとして有効になります。
/sdl で有効になる警告 | 同等のコマンド ラインスイッチ | 説明 |
---|---|---|
C4146 | /we4146 | 単項マイナス演算子が符号なしの型に適用され、符号なしの結果になります。 |
C4308 | /we4308 | 負の整数定数が符号なしの型に変換されて、多くの場合は意味のない結果になります。 |
C4532 | /we4532 | continue 、break 、または goto キーワードを __finally /finally ブロック内に使用すると、異常終了時に未定義の動作になります。 |
C4533 | /we4533 | 変数の初期化コードが実行されません。 |
C4700 | /we4700 | 初期化されていないローカル変数が使用されます。 |
C4703 | /we4703 | 初期化されていない可能性のあるローカル ポインター変数が使用されます。 |
C4789 | /we4789 | 特定の C ランタイム (CRT) 関数の使用時にバッファー オーバーランが発生します。 |
C4995 | /we4995 | プラグマ deprecated でマークされた関数の使用。 |
C4996 | /we4996 | deprecated としてマークされた関数の使用。 |
実行時のチェック
/sdl
を有効にすると、実行時に次のチェックを実行するコードがコンパイラによって生成されます。
/GS
の実行時バッファー オーバーラン検出の厳格モードを有効にします。#pragma strict_gs_check(push, on)
を使用したコンパイルと同等です。制限付きでポインターのサニタイズを行います。 逆参照がない式でも、ユーザー定義のデストラクターがない型でも、ポインターの参照は、
delete
の呼び出し後、無効なアドレスに設定されます。 このサニタイズは、古いポインター参照の再使用を防止するために役立ちます。クラス メンバーのポインターを初期化します。 ポインター型のクラス メンバーをオブジェクトのインスタンス化時に
nullptr
に自動的に初期化します (コンストラクターの実行前)。 コンストラクターで明示的に初期化しない、初期化されていないポインターの使用を防ぐのに役立ちます。 コンパイラによって生成されるメンバー ポインターの初期化は、次の場合に限り呼び出されます。オブジェクトがカスタム (ユーザー定義の)
operator new
を使用して割り当てられていないオブジェクトが配列 (例:
new A[x]
) の一部として割り当てられていないクラスがマネージドでもインポート済みでもない
クラスにユーザー定義の既定のコンストラクターがある。
コンパイラによって生成されるクラス初期化関数によって初期化されるためには、メンバーがプロパティや定数ではなく、ポインターである必要があります。
詳細については、「警告、/sdl、初期化されていない変数の検出の改善」を参照してください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[C/C++]>[全般] プロパティ ページを選択します。
プロパティのドロップダウン コントロールを使用して、[SDL チェック] プロパティを設定します。 [OK] または [適用] を選択して、変更内容を保存します。