何か色々徒然と
Security Development Lifecycle (SDL) チェックって?
(2016. 9. 18)
Visual Stuidoでプロジェクトを立ち上げる時にふと目にする「Security Development
Lifecycle (SDL) チェック」、下のダイアログにあるこれです:
これ何だろうと思う方もいらっしゃるかと思います。これはセキュア(安全)な関数の使用を矯正するかを決めます。C言語には例えばsprintf関数とかstrcpy関数など文字列を扱う関数が多数あります。これらの関数は文字列バッファに対して書き込みを行いますが、書き込み先の文字バッファのバッファオーバーランに対して安全ではありませんでした。例えば、
char buf[10];
sprintf( buf, "ABCDEFGHIJKLMNOPQRSTUVWXYZ!" );
上のように10バイトしか入らない文字列配列に対してアルファベットを全部書き込むバッファーオーバーランが通ってしまいます。こういう危険行為を回避するため随分前から「セキュア関数」というのが用意されるようになりました。上のコードも、
char buf[10];
sprintf_s( buf, 10, "ABCDEFGHIJKLMNOPQRSTUVWXYZ!" );
とsprintf_s関数に置き換える事が可能です。ただ、上のようなセキュア関数を使えばコードが動くかというとそうではなく、例外で落ちます。でも暴走するよりはマシです(^-^;。で、「Security Development Lifecycle (SDL) チェック」にチェックを入れると、このセキュア関数の使用が強要されます。具体的にはセキュアじゃない関数を使うとコンパイラエラーになります。チェックを外しても「危ないよ〜」と警告(warning)が出ます。
セキュアでない関数を使う事のメリットはもうありませんので、このチェックは入れたままにしておきましょう。