解析ツール「Understand 2.0日本語版」のコード可視化機能を試してみた関数や変数の依存関係もグラフィカルに表示

テクマトリックスが2009年7月に発表した、ソースコード解析ツールの最新版「Understand 2.0日本語版」。GUIやマニュアルの日本語化以外に、機能の追加や強化が施されている。実際にコード解析機能を検証してみた。

2009年08月04日 08時00分 公開
[小泉俊幸]

 テクマトリックスは2009年7月、ソースコード解析ツール「Understand 2.0 日本語版」(以下、Understand)の販売を開始した。Understandは、米国Scientific Toolworksが開発したソースコード解析ツール。C/C++、C#Javaなどの言語に対応したソースコード解析を行い、ソースコード内の呼び出しや参照などの依存関係、クラスや制御フローの階層構造といった情報を“グラフィカルビュー”によって可視化する。今回からメニューやボタンなどのGUI部分とヘルプ、マニュアルなどが日本語になった。

 以前、著者が使用していた静的解析ツールは、ヘッダファイルが1つないだけで解析ができなかった。その点、Understandは利用可能な情報の範囲内で解析してくれる“堅牢(けんろう)さ”があるといえる。例えば、コーディング途中のソースコードを解析することができ、まだコンパイルが通ってないソースコードでさえ、その構造を明らかにしてくれるので非常に重宝する。今回は、倒立振子用のモーター制御ソフトの解析を行った。

プロジェクト作成

photo Understandの起動画面

 Understandの起動画面で「新規プロジェクト…」をクリックすると、新規プロジェクトウィザードが立ち上がる。

photo 新規プロジェクトウィザード

 ここでプロジェクト名やワーク用ディレクトリ、開発言語、解析対象ソースファイルを指定すると、解析が可能になる。

photophoto 開発言語(左)と解析対象ソースファイル(右)の指定画面《クリックで拡大》

 解析を実施すると、ヘッダファイルがそろっていない場合は確認が行われる。「このファイルを無視」することで、そろっていなくても解析を進めることができる。

photo ヘッダファイルがない場合は、「このファイルを無視」を選択する

ソースコードの解析

photo 画面の左端のフィルタエリアで表示を「Function」、フィルタに「main」を入れると「getMainCycle」と「main」が選択される

 ソースコードの解析が終了すると、Understandを使って解析したソースコード内を調べることが可能になる。

 今回は、main関数を見てみることにした。

 Understandの画面の左上のフィルタエリアの表示を「Function」、フィルタに「main」を選択すると、フィルタエリアの下の「情報ブラウザ」にmain関数が呼び出している関数や使用しているグローバル変数、定数、main関数を呼び出している関数、さらにライン数やサイクロマティック数などが表示される。

photo entry関数のソースコード表示

 ここではmainを呼び出している関数は「Called By」とラベルされた部分に表示された。この場合は「__entry」関数である。この要素をクリックすると__entry関数のソースコードを見ることができる。この関数はPowerOn時に呼び出される関数であることが分かる。

 Understandでは、ソースコードが表示されるウィンドウはエディタになっていて直接編集することができる。ソースエディタで[Ctrl]キーを押した状態にすると、一時的にブラウズモードになり、クリックしたエンティティの情報を表示したり、そのエンティティの定義部分にジャンプすることができる。

 次に、mainが呼び出している関数を見てみよう。情報ブラウザの「Calls」ラベルの所にリストされているが、グラフィカルに表示することもできる。表示方法はさまざまあるが、複数から呼び出されている場合はグラフの方が分かりやすいだろう。mainのソースコードで関数宣言の部分を右クリックして指定する方法が直感的である。

photo グラフィカルビューの表示

 すると以下のようなグラフが表示された。破線で囲まれているのはヘッダファイルやソースコードがないために未解析の関数である。実線で囲まれた解析済み関数はダブルクリックすればそのソースコードを表示することができる。mainから呼び出されてないのは割り込みハンドラなどの関数である。

photo mainコールグラフ《クリックで拡大》
photo バタフライグラフの表示例《クリックで拡大》

 呼び出し元と呼び出し先の両方を表示したい場合には「バタフライグラフ」を利用するとよいだろう。

 また「エンティティエクスプローラ」を使用すると、表形式で呼び出しの階層構造を表示できる。

 実際の解析では、表形式で表示する方が便利な場合が多いだろう。エンティティエクスプローラの[オプションの同期]にチェックを入れておくと、情報ブラウザにエンティティエクスプローラで選択したエンティティの情報が自動的に表示される。

 さらに、エンティティエクスプローラの右下にあるオプションの[最初の参照に移動]にチェックを入れると、選択したエンティティを呼び出しているソースコードが自動的に表示される。

 コールグラフは静的な構造を表しており、関数の呼び出し順や呼び出し回数などのmain関数の振る舞いに関する構造は表していない。振る舞いに関する情報を得たい場合には、コントロールフローを表示させる。

photo mainエンティティエクスプローラ《クリックで拡大》
photo mainコントロールフロー《クリックで拡大》

 このmain関数のサイクロマティック数は「43」で、少し複雑なフローグラフが生成された。

 Understandでは、コールグラフやコントロールフローなどをクリップボードにコピーしたり、JPEGやPNGなどの画像形式で保存したり、Microsoft Office Visioにエクスポートしたりできる。

 また、ここで紹介したグラフ以外にも宣言グラフなどがあり、選択したエンティティに応じて利用できる。

アーキテクチャ情報の収集も可能

photo アーキテクチャブラウザ

 ソースコードよりも抽象度の高い情報として「アーキテクチャ情報」がある。一般にアーキテクチャ情報は設計時の情報がないと分からないが、ソースコードだけで判断できるものもある。

 Understandでは、ビルトインとして3つのアーキテクチャを自動生成できる。ソースファイルが保存されているディレクトリ情報からアーキテクチャを抽出する「Filesystem」、ファイルが更新された時期を利用したアーキテクチャを抽出する「Calendar」、プログラム言語のアーキテクチャを抽出する「Language」の3つである。

 アーキテクチャブラウザを開いているときは、画面左下の情報ブラウザには含まれる関数リストなどのファイルレベルの情報が表示される。グラフィカルビューについてもファイルレベルのバタフライグラフを生成することができる。

 アーキテクチャブラウザの上位ノードを選択して右ボタンメニューから「メトリクスサマリー」を選択すると、各種メトリクス情報を得ることができる。

photo アーキテクチャメトリクスサマリー

 ここでは最大サイクロマティック数が「43」なので、main関数が最も複雑度が高いことが分かる。

 また、プロジェクトメニューから「プロジェクトレポート」を選択すると、ダイアログボックスが開きリポートを生成することができる。このリポートを見ることで各関数のサイクロマティック数を確認できる。

photo プロジェクトレポート生成

 さらにプロジェクトメニューから「プロジェクトの概要グラフ」を選択すると、各種のランキンググラフを表示できる。これを見るとやはりmain関数が最も複雑で、次がEditMap関数であることが分かる。

photo プロジェクトの概要グラフ《クリックで拡大》
photo 依存関係ブラウザ

 また、依存関係ブラウザを利用するとファイル間の関数呼び出しや、変数の参照や書き換えなどの状況を把握することができる。

 Understandでは、ビルトインアーキテクチャ以外にもカスタマイズアーキテクチャを作成することもできる。ただし、静的コード解析の範囲を超えて設計リバースやアーキテクチャアセスメントなどの作業が必要になる。

 カスタムアーキテクチャの一例としては「staff」がある。staffは担当者別にソースコードを分類した際に活用できるアーキテクチャだ。

 カスタムアーキテクチャの作成には、アーキテクチャウィザードを利用する。アーキテクチャウィザードは、アーキテクチャメニューから「カスタムアーキテクチャの作成」を選択すると起動される。

photo アーキテクチャの作成

 今回は「Dynamic」アーキテクチャを作成して、割り込み状態動作と通常状態動作を分けることにした。main関数のコールグラフから、main関数が呼び出している関数を含んだファイルを通常にアサインする。

photo アーキテクチャビルダーで関数ファイルをアサインする

 この作業が一通り済んだら、マップされていないエンティティを表示して残ったファイルを割り込みにアサインする。

 その場合はUnderstandではなく、関数や変数単位でアーキテクチャを解析できる「Lattix」などのツールを利用する必要がある。

 Understandで扱うアーキテクチャは厳密なソフトウェアアーキテクチャというよりは、ソースコードを絞り込むフィルタとしての利用価値が高いだろう。例えば、最近変更された割り込み処理などは、CalendarとDynamicアーキテクチャを組み合わせることで、その処理を容易に特定することができる。

photo 作成したアーキテクチャ

Understandの利用メリットとは?

 Understandでは、関数・変数レベルからファイルレベル、さらにはアーキテクチャレベルまで抽象度を上げてソースコードを解析することができる。要求仕様や設計仕様を文書化しておくことが基本であるが、実際の開発ではコードの文書化が十分でないことが多い。そうした場合、このツールは非常に強力なサポート機能を提供してくれるだろう。

ITmedia マーケティング新着記事

news136.png

ジェンダーレス消費の実態 男性向けメイクアップ需要が伸長
男性の間で美容に関する意識が高まりを見せています。カタリナ マーケティング ジャパン...

news098.jpg

イーロン・マスク氏がユーザーに問いかけた「Vine復活」は良いアイデアか?
イーロン・マスク氏は自身のXアカウントで、ショート動画サービス「Vine」を復活させるべ...

news048.jpg

ドコモとサイバーエージェントの共同出資会社がCookie非依存のターゲティング広告配信手法を開発
Prism Partnerは、NTTドコモが提供するファーストパーティデータの活用により、ドコモオ...