桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

秘伝のソース

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
  • 追記

マクロ定義する事で置換出来る模様。ありそうな気はしていたけど探すの面倒だった。あと多すぎて読めない。


ちょっと変更が必要なのが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を使うなどして引数のチェックをするようにした方が良いな。

  • 追記

こちらはコンパイルオプションでチェック出来る模様。