printf(msg) の危険度
2008-12-17


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

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

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

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

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


    printf("%s", msg);
そして、C++ でも同様だ。

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

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

[C 言語]
[c++(マクロへ移行中)]
[Programming]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット