秘伝のソース
d:id:youandi:20110909:p2
今秘伝のソースを最新コンパイラ環境に移植する作業していますが、ソースコード見てたらSCCS(Source Code Control System)でバージョン管理してたっぽいものがあってワロタ。
大体20年前のソースコードなんだけど、もうCVSが存在するのに何故にSCCSを使っていたのかは謎だ。因みに今はMercurialでバージョン管理されています。
ここからが本題ですが、C言語やC++で書かれたソースコードの大半は文字列処理で、コンパイラはVisualC++なのでセキュリティ強化版に置き換えてます。
strcpyやsprintfなら、以下のようなマクロでコードは書き換えずにセキュリティ強化版に置き換えできるのでそのままで。
#define strcpy strcpy_s #define strncpy strncpy_s #define sprintf sprintf_s #define _snprintf _snprintf_s #define strcat strcat_s
- 追記
マクロ定義する事で置換出来る模様。ありそうな気はしていたけど探すの面倒だった。あと多すぎて読めない。
-
- Secure Template Overloads | Microsoft Docs
- この定義をしてもC言語の方は置換できない模様。strncpy()も置換してくれない模様。
ちょっと変更が必要なのがfopen。
かなり変更が必要なのがsscanf。文字や文字列の場合は文字数を指定する必要がある。
const char target[] = "a hoge"; char buff1; char buff2[ 10 ]; sscanf( target, "%c %s", &buff1, buff2 ); sscanf_s( target, "%c %s", &buff1, 1, buff2, _countof( buff2 ) );
sprintf_sで2つほどバグが見つかって、sscanf_sで10個ほどバグが見つかった。sscanf_sで引数が足りなかったりすると、変なプログラムの落ち方をしてとてもデバッグがしづらい。templateを使うなどして引数のチェックをするようにした方が良いな。
- 追記
こちらはコンパイルオプションでチェック出来る模様。
-
- /analyze (Code Analysis) | Microsoft Docs
- VS2012以降ならばPro版でも利用可能なオプション。VS2010まではPro版よりもっと上のエディションが必要。