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());

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

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2008/12/17/4012714/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。