Visual Studio 2013 C++でWizardに従ってプロジェクトを作ると、最初のあたりで
□Security Development Lifecycle
というチェックボックスが出てくる。今まで気にせずにチェックしていたのだが、意味を調べてみた。
結論としては、このチェックボックスをチェックすると以下のリストにある警告がエラー扱いになるようだ。
なので、チェックしておくほうが安心だろう。
https://msdn.microsoft.com/ja-jp/library/jj161081.aspx?f=255&MSPPError=-2147217396
/sdl (追加のセキュリティ チェックの有効化)
推奨される Security Development Lifecycle (SDL) のチェックを追加します。 これらのチェックには、エラーとしての追加のセキュリティ関連の警告、および追加の安全なコード生成機能が含まれます。
/sdl[-]
/sdl を指定すると、/GS で提供されるベースライン セキュリティ チェックのスーパーセットが有効になり、/GS- がオーバーライドされます。 既定では、/sdlは無効になっています。 /sdl- を指定すると、追加のセキュリティ チェックが無効になります。
/sdl を指定すると、次の警告がエラーとして有効になります。
/sdl で有効になる警告 |
同等のコマンド ラインスイッチ |
説明 |
---|---|---|
/we4146 |
単項マイナス演算子が符号なしの型に適用され、符号なしの結果になります。 |
|
/we4308 |
負の整数定数が符号なしの型に変換されて、多くの場合は意味のない結果になります。 |
|
/we4532 |
continue 、break、または goto を __finally/finally ブロック内に使用すると、異常終了時、未定義の動作になります。 |
|
/we4533 |
変数の初期化コードが実行されません。 |
|
/we4700 |
初期化されていないローカル変数が使用されます。 |
|
/we4703 |
初期化されていない可能性のあるローカル ポインター変数が使用されます。 |
|
/we4789 |
特定の C ランタイム (CRT) 関数の使用時にバッファー オーバーランが発生します。 |
|
/we4995 |
deprecated プラグマでマークされた関数が使用されます。 |
|
/we4996 |
deprecated でマークされた関数が使用されます。 |
/sdl を有効にすると、実行時に次のチェックを実行するコードがコンパイラによって生成されます。
-
/GS の実行時バッファー オーバーラン検出の strict モードを有効にします。#pragma strict_gs_check(push, on) を使用したコンパイルと同等です。
-
制限付きでポインターのサニタイズを行います。 逆参照がない式でも、ユーザー定義のデストラクターがない型でも、ポインターの参照は、delete の呼び出し後、無効なアドレスに設定されます。 これは、古いポインター参照の再使用を防止するために役立ちます。
-
クラス メンバーの初期化を実行します。 すべてのクラス メンバーをオブジェクトのインスタンス化時にゼロに自動的に初期化します (コンストラクターの実行前)。 これは、コンストラクターが明示的に初期化しないクラス メンバーに関連付けられた、初期化されていないデータの使用を防止するために役立ちます。
詳細については、「Security Development Lifecycle Blog (Security Development Lifecycle に関するブログ)」を参照してください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
-
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
-
[C/C++] フォルダーを選択します。
-
[全般] ページで、[SDL チェック] ドロップダウン リストからオプションを選択します。