printf(msg) の危険度2008年12月17日 16時21分04秒

printf 系の関数に、単一の文字列を表示するために、そのまま文字列を渡す行為を良く見かける。これは、C/C++ 言語の中でも、極めて危険な行為だ。sprintf と fprintf の系統のどちらでも関係なく、かつこれらの派生関数にも一貫して言える。


    printf(msg);

はよく行われる。そして、C++ だと以下の様な例も見られる。

    printf(obj.toString());

なぜこれが危険度大なのかと言うと、msg や toString() が% を含まないという保証が無いからだ。

例えば、SQL クエリ等、文法にて % の利用がある場合は、自殺行為以外の何物でもない。この様な、コードを書く者。この様なコードをコード査読の時に見付けない人々。そして、このコードでも動いていたと抜かすプロジェクトマネジャー等と関わった後は、これらの人々の評価を数段下げておいた方がいい。このような問題は、今後も散見されるのが世の常だから。

もちろん正しいコードはこの様になる。


    printf("%s", msg);

そして、C++ でも同様だ。

    printf("%s", obj.toString());

そうすると、遅くなると戯言を抜かす者も多いが、動いかないコードを作っておかれては、最適化以前の問題だ。