splint

エンジニアは「七つ道具」を持っている。

Perlの開発者、Larry Wallは言う。


プログラマの3つの美徳は、無精、短気、傲慢である。
優秀なエンジニアは、成果の完成度を追求するのは勿論だが、上記の三大美徳を持つがゆえに、作業を無駄なく手っ取り早く簡単に、しかし誤り無く片付ける手段を探すことにも熱心である。その成果として、作業を確実かつ効率的に進めるための便利なツールを、七つとは限らないが持っているものだ。「何それ?知らね」とか抜かす奴は、三大美徳のどれか、または全てが欠けているので、身に付けるよう努力するように。

例えば、俺であれば、まず使い勝手が良いテキストエディタまたはIDEは外せない。さらに、grepawk、tailといったUNIXの基本コマンド群が使えると作業がはかどる。そして、単純作業を手っ取り早く片付けるためにperlがあるとなお良い。他にもステップ数の計測ツールとか、バージョン管理ツールとか、いろいろある。

そして、Cプログラマであればまず入れておきたい道具が、lintである。C言語で書かれたソースコードを静的解析して、バグになりがちな記述が見つかったら警告を出す、という代物である。自分の目でソースコードを眺めるよりも素早く、かつ確実であるため、使わない手はない。

そういうわけで、ちょうどC言語で開発中なので早速lintを探したのだが・・・無い。開発に使ってるLinuxディストリビューションには含まれていないらしい!けしからん!
仕方が無いので、ちょっと探してみたところ、ANSI C対応のlintクローンを見つけた。

前置きが長くなったが、そのlintクローンがsplintである。
マニュアルが全部英語だが、そんなことでくじけていてはエンジニアとはいえないので、斜め読みして大まかな使い方をおさえる。とりあえず+skip-sys-headers +single-include +posixlibあたりのオプションを与えて実行すれば、期待した動きをしてくれそうだ。それでは、実行。

encode.c:42:12: Variable j declared but not used

おっと、いかん。未使用変数を置きっ放しにしているらしい。これは削除せねば。

encode.c:205:13: Buffer overflow possible with sprintf.  Recommend using snprintf instead: sprintf

sprintfの代わりにsnprintfを使え?どうやら、バッファへの最大書き込み容量を設定できる関数があるようだ。これを設定しておけば、データが切れることがあっても、バッファオーバーフローでクラッシュすることは無くなるわけだ。なるほど。

ほかにもたくさん警告がでたのだが、ほとんど無視して問題の無いレベルの内容であった。lintは細かすぎるほどのチェックをかけるので、全部を相手にするのはむしろ時間の無駄である。

こんな感じで、便利なツールであるので、エンジニアはこういったチェックツールを積極的に活用して楽に品質を上げることを考えたほうがよい。JavaであればParasoftのjtestや、Artho Softwareのjlintがある。ただし、この手のツールは、個人レベルで使ってもあまり効果がない。使う場合は、チーム全体で使うようにルールを決めること。