お利口なdiff

お利口なエディタの続きです。

ラインカウンタにおいて、

修正

追加

削除

というようにカウントするとき。

diff -c 辺りで行頭にプリントされる文字でカウントしますよね?

!

+

え?それすらして無い?全部手作業ですか。あぁそぉですか。

現場で求められているのは、コードへの修正がコードに与える影響をある程度考慮した差分抽出なのです。

  • 単なるコメントの追加か
  • パスの増減(分岐の増減)
  • パスへの影響の有無
  • 定数の変更
  • 条件の変更

モジュール単体レベルであっても上記について差分の特徴量を抽出できるだけで、修正の与える影響を定量化できるはずです。

ケーススタディをいくつか挙げておきます。

(1)コメント追加で大エンバグ

単なるコメント追加のつもりだったのに、/*が入れ子になって閉じていなかったためにバグが発生。

(2)真理値表の漏れ

ある条件Aの分岐にAND条件Bを追加したところ、Aかつ!Bの条件のときの実装にバグ発生。

(3)定数の変更

ある#defineマクロの定義を変更しただけなのに、それを参照している他の部分で条件分岐が変化してバグ発生。

ソースレベルで静的に解析できる範囲は極めて限られています。しかしながら、C/C++ではプリプロセッサという悪魔が常在しているため、意図しない実装の変化が起こりがちです。

少なくともコンパイラはそれを検出し、たった一つのマクロの変更が及ぼしたバイナリの変化を引き起こすわけですが、その変化の差分をすべて目で洗い出せというのは、そもそも無理からぬことなのです。

そこでここで提案するのは、プログラムをコンパイラと同様に解析して、実装変更前と変更後で制御パスに変化があったかどうか、条件分岐に変化があったかどうか、switch~caseの網羅性に変化があったかどうかを抽出するツールです。

分かりやすく言えば、変更前後のソースから自動的にchangelogを出力できるツールです。

え?そんなのとっくにあるって?みんな使ってる?そりゃしらなんだ。

まぁ優秀な天才型にはまったく不要でしょうが、有象無象を管理して大勢で仕事を進めるなら必須だと思うのですが、見かけたことがありません。不思議です。

(2008.05.15追記)

cdiff – perform a cleardiff which includes lines of surrounding context

http://www.cmcrossroads.com/bradapp/clearperl/cdiff.html

つづき:お利口なdiffの続き