ソフトウェア品質と保守生産性を低下させるコードクローンとそれを発見する技術について解説する。
2005年12月に起きた証券会社による新規上場株の大量誤発注問題は、証券会社担当者の人為的なミスと東証のシステムの不具合が重なったことによって発生した。この問題は経営責任を問われる事態に波及し、東京証券取引所の代表取締役をはじめ3名の役員が辞職したことは記憶に新しい。今やシステムの不具合ひとつで、社長の首が飛ぶ時代になったといえる。こういった状況下において、長年保守を行っているシステムの品質が満足いく状態であると胸を張って言えるシステム担当者は何人いるだろうか。このようなシステムを分析し、危険性を定量的に示す研究のひとつがコードクローン技術である。
コードクローンとは、ソースコードの一部を複製することで作られたコードの部分である。プログラマは、新たな機能を実装するために既存のコードを複製し一部を変更する。しかし、オリジナルのコードとほぼ同一か非常に似ている。当然、似た機能を持つコードは一箇所だけでよいわけで、こういったコードのクローンが多く存在すると、保守性や品質が悪いシステムになる可能性が高い。
一般的にコードクローンは5-10%くらいはあると言われている。最近の研究によると、Linux Kernel(2002年)のコードクローンは15-20%、Gnu Compiler Collection(1999年)は9%、X Window system(1995年)は19%、Sun Java SDK(2002年)は21-29%と言われている。有名なOSSシステムでもこれほどのコードクローンを含んでいる。一般のインハウスのアプリケーションシステムではさらに多いとだろう。あるCobolで書かれた給与システムは60%がコードクローンであったとの報告もある。
コードクローンが発生する原因はなんであろうか。コーディングを行う上で、既存のコードと似たコードを書きたいことはよくある。そのコードをコピーして、すこし修正すれば簡単に新しい機能をコーディングすることができる。よく考えれば、既存のコードを修正し、新しい機能を満たすように実装すればよい。しかし、テストが完了して稼動している既存のシステムの一部を変更するのはリスクが伴う。必要な部分をそのままコピーして、新しいモジュールの一部にしてしまえば、既存のモジュールへの影響はない。こういった考えから、コードクローンが発生してしまうのだろう。特に初期開発から10年以上も保守し続けて、開発担当者も引き継ぎ引継ぎを繰り返し、既存のコードを変更するリスクをとりたくないときにはこういった方法で新規開発を行わざるを得ない。共通した部品として切り出すべき機能であったとしても、複数のモジュールから利用されるとしたら、修正ミスが関連する複数のモジュールに波及してしまうことを防ぎたいという気持ちもある。モジュール強度を高めたいとの気持ちとも結びつくだろう。しかしながら、不具合の修正があるコードクローンに対して行われた場合、すべてのクローンも修正しないと危険であることも事実である。コードクローンは、リファクタリングを行うことを困難にして、保守性を低下させてしまう原因になる。
コードクローンの研究は、1990年代の中ごろから主に海外で行われてきていた。Bakerによる研究では、ソースコードを行単位で比較してコードクローンを検出しようと試みた。BaxterはC言語のソースコードを構文解析して解析木を比較することによってコードクローンを発見する方法を発表した。さらにBaxterは発見したクローンを、インラインプロシージャやプリプロセッサを使用して自動的に削除する方法についても言及している。
日本では、大阪大学大学院情報科学研究科の井上研究室において、コードクローンの研究が進められている。井上研究室でコードクローンの研究を行っていた現産業技術総合研究所の神谷年洋氏は、コードクローンを効率よく発見するツールCCFinderXを開発した。CCFinderXは、ソースコードを字句解析してトークンの列に直してからコードクローン検出を行うツールである。ソースコードを言語の文法知識に基づき変形し解析するには、①クラススコープや名前空間による複雑な名前の正規化を行う②初期化テーブルを取り除く③モジュールの区切りを認識するというステップで行う。Baxterの研究に比べて、ほぼ字句解析しか行わないため、発見の精度が低下する可能性もあるが、新しい言語へ迅速な対応が可能となる。また、非常に高速処理な処理が実現できるため大規模なシステムに適用可能である。
近年、CCFinderXをより簡単に利用できるためのGUIフロントエンドGemX等も開発されており、ユーザーインターフェースが改善されている。
日本ユニシスがOSSで公開しているRinza RDF RepositoryのソースコードをCCFinderXとGemXを使用して分析してみた。
CCFinderX Version: 10.0.9
Web site: http://www.ccfinder.net/ccfinderx-j.html
最小クローン長 100
最小クローンセットサイズ 10
ファイル数は632ファイルである。

散布図は、縦軸と横軸にソースファイル名を並べてあり、黒い点が発見されたコードクローンである。つまり対角線にある黒い点は同一のファイル内にコードクローンが発生していることを示す。Rinza RDF Repositoryは、2004年に開発されたシステムであるため、比較的コードクローンは多くない。下のほうに集中しているコードクローンはコード生成ツールによって生成されたコードである。
ソースコードの中身を開発の側面から定量的に分析するツールは数多くある。エディタの文法解析機能や静的解析ツールは、開発者を補助する観点から用意されたツールである。しかしながら、ソースコードの品質を捉えるには、十分であるとは言えないものが多いと思う。コードクローン技術によって、既存の大規模なシステムを静的に解析し、システムの保守性を定量的に示すことが可能である。システムのコードクローンの量の経年変化を捉えることも保守性との関係を導くために有効であろう。また、外部委託した開発を評価するためにも利用できる可能性がある。
日本ユニシス株式会社
先端技術部 上席研究員
江平裕昭
Copyright (C) 2004-2011 Nihon Unisys, Ltd. All Rights Reserved.
Powered by Movable Type Open Source