/sdl (追加のセキュリティ チェックの有効化)

推奨される Security Development Lifecycle (SDL) のチェックを有効にします。 これらのチェックにより、セキュリティ関連の警告がエラーに変更され、追加の安全なコード生成機能が設定されます。

構文

/sdl[-]

解説

/sdl を指定すると、/GS で提供されるベースライン セキュリティ チェックのスーパーセットが有効になり、/GS- がオーバーライドされます。 既定では、/sdl はオフになっています。 /sdl- を指定すると、追加のセキュリティ チェックが無効になります。

コンパイル時のチェック

/sdl では、次の警告がエラーとして有効になります。

/sdl で有効になる警告 同等のコマンド ラインスイッチ 説明
C4146 /we4146 単項マイナス演算子が符号なしの型に適用され、符号なしの結果になります。
C4308 /we4308 負の整数定数が符号なしの型に変換されて、多くの場合は意味のない結果になります。
C4532 /we4532 continuebreak、または 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 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[全般] プロパティ ページを選択します。

  3. プロパティのドロップダウン コントロールを使用して、[SDL チェック] プロパティを設定します。 [OK] または [適用] を選択して、変更内容を保存します。

関連項目

MSVC コンパイラ オプション
MSVC コンパイラ コマンド ラインの構文