2009年08月04日 08時00分 UPDATE
特集/連載

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

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

[小泉俊幸]

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

この記事を読んだ人にお薦めのホワイトペーパー

この記事を読んだ人にお薦めの関連記事

Loading

注目テーマ

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

news093.jpg

最も「親日」になった国は? 電通が「ジャパンブランド調査2016」を実施
電通は、2016年4〜5月に20カ国・地域を対象に実施した「ジャパンブランド調査2016」の結...

news082.jpg

マーケティングオートメーションツール「SATORI」でWebプッシュ通知が利用可能に
SATORIはWebプッシュ通知ツール「pushcrew」の国内展開を行うアッションはSATORIとpushcr...

news071.png

「KANADE DSP」がスマートフォン向けディスプレイ広告枠へのネイティブ広告の配信を開始
京セラコミュニケーションシステムは、広告配信サービス「KANADE DSP」がスマートフォン...