テクマトリックスが2009年7月に発表した、ソースコード解析ツールの最新版「Understand 2.0日本語版」。GUIやマニュアルの日本語化以外に、機能の追加や強化が施されている。実際にコード解析機能を検証してみた。
テクマトリックスは2009年7月、ソースコード解析ツール「Understand 2.0 日本語版」(以下、Understand)の販売を開始した。Understandは、米国Scientific Toolworksが開発したソースコード解析ツール。C/C++、C#、Javaなどの言語に対応したソースコード解析を行い、ソースコード内の呼び出しや参照などの依存関係、クラスや制御フローの階層構造といった情報を“グラフィカルビュー”によって可視化する。今回からメニューやボタンなどのGUI部分とヘルプ、マニュアルなどが日本語になった。
以前、著者が使用していた静的解析ツールは、ヘッダファイルが1つないだけで解析ができなかった。その点、Understandは利用可能な情報の範囲内で解析してくれる“堅牢(けんろう)さ”があるといえる。例えば、コーディング途中のソースコードを解析することができ、まだコンパイルが通ってないソースコードでさえ、その構造を明らかにしてくれるので非常に重宝する。今回は、倒立振子用のモーター制御ソフトの解析を行った。
Understandの起動画面で「新規プロジェクト…」をクリックすると、新規プロジェクトウィザードが立ち上がる。
ここでプロジェクト名やワーク用ディレクトリ、開発言語、解析対象ソースファイルを指定すると、解析が可能になる。
解析を実施すると、ヘッダファイルがそろっていない場合は確認が行われる。「このファイルを無視」することで、そろっていなくても解析を進めることができる。
ソースコードの解析が終了すると、Understandを使って解析したソースコード内を調べることが可能になる。
今回は、main関数を見てみることにした。
Understandの画面の左上のフィルタエリアの表示を「Function」、フィルタに「main」を選択すると、フィルタエリアの下の「情報ブラウザ」にmain関数が呼び出している関数や使用しているグローバル変数、定数、main関数を呼び出している関数、さらにライン数やサイクロマティック数などが表示される。
ここではmainを呼び出している関数は「Called By」とラベルされた部分に表示された。この場合は「__entry」関数である。この要素をクリックすると__entry関数のソースコードを見ることができる。この関数はPowerOn時に呼び出される関数であることが分かる。
Understandでは、ソースコードが表示されるウィンドウはエディタになっていて直接編集することができる。ソースエディタで[Ctrl]キーを押した状態にすると、一時的にブラウズモードになり、クリックしたエンティティの情報を表示したり、そのエンティティの定義部分にジャンプすることができる。
次に、mainが呼び出している関数を見てみよう。情報ブラウザの「Calls」ラベルの所にリストされているが、グラフィカルに表示することもできる。表示方法はさまざまあるが、複数から呼び出されている場合はグラフの方が分かりやすいだろう。mainのソースコードで関数宣言の部分を右クリックして指定する方法が直感的である。
すると以下のようなグラフが表示された。破線で囲まれているのはヘッダファイルやソースコードがないために未解析の関数である。実線で囲まれた解析済み関数はダブルクリックすればそのソースコードを表示することができる。mainから呼び出されてないのは割り込みハンドラなどの関数である。
呼び出し元と呼び出し先の両方を表示したい場合には「バタフライグラフ」を利用するとよいだろう。
また「エンティティエクスプローラ」を使用すると、表形式で呼び出しの階層構造を表示できる。
実際の解析では、表形式で表示する方が便利な場合が多いだろう。エンティティエクスプローラの[オプションの同期]にチェックを入れておくと、情報ブラウザにエンティティエクスプローラで選択したエンティティの情報が自動的に表示される。
さらに、エンティティエクスプローラの右下にあるオプションの[最初の参照に移動]にチェックを入れると、選択したエンティティを呼び出しているソースコードが自動的に表示される。
コールグラフは静的な構造を表しており、関数の呼び出し順や呼び出し回数などのmain関数の振る舞いに関する構造は表していない。振る舞いに関する情報を得たい場合には、コントロールフローを表示させる。
このmain関数のサイクロマティック数は「43」で、少し複雑なフローグラフが生成された。
Understandでは、コールグラフやコントロールフローなどをクリップボードにコピーしたり、JPEGやPNGなどの画像形式で保存したり、Microsoft Office Visioにエクスポートしたりできる。
また、ここで紹介したグラフ以外にも宣言グラフなどがあり、選択したエンティティに応じて利用できる。
ソースコードよりも抽象度の高い情報として「アーキテクチャ情報」がある。一般にアーキテクチャ情報は設計時の情報がないと分からないが、ソースコードだけで判断できるものもある。
Understandでは、ビルトインとして3つのアーキテクチャを自動生成できる。ソースファイルが保存されているディレクトリ情報からアーキテクチャを抽出する「Filesystem」、ファイルが更新された時期を利用したアーキテクチャを抽出する「Calendar」、プログラム言語のアーキテクチャを抽出する「Language」の3つである。
アーキテクチャブラウザを開いているときは、画面左下の情報ブラウザには含まれる関数リストなどのファイルレベルの情報が表示される。グラフィカルビューについてもファイルレベルのバタフライグラフを生成することができる。
アーキテクチャブラウザの上位ノードを選択して右ボタンメニューから「メトリクスサマリー」を選択すると、各種メトリクス情報を得ることができる。
ここでは最大サイクロマティック数が「43」なので、main関数が最も複雑度が高いことが分かる。
また、プロジェクトメニューから「プロジェクトレポート」を選択すると、ダイアログボックスが開きリポートを生成することができる。このリポートを見ることで各関数のサイクロマティック数を確認できる。
さらにプロジェクトメニューから「プロジェクトの概要グラフ」を選択すると、各種のランキンググラフを表示できる。これを見るとやはりmain関数が最も複雑で、次がEditMap関数であることが分かる。
また、依存関係ブラウザを利用するとファイル間の関数呼び出しや、変数の参照や書き換えなどの状況を把握することができる。
Understandでは、ビルトインアーキテクチャ以外にもカスタマイズアーキテクチャを作成することもできる。ただし、静的コード解析の範囲を超えて設計リバースやアーキテクチャアセスメントなどの作業が必要になる。
カスタムアーキテクチャの一例としては「staff」がある。staffは担当者別にソースコードを分類した際に活用できるアーキテクチャだ。
カスタムアーキテクチャの作成には、アーキテクチャウィザードを利用する。アーキテクチャウィザードは、アーキテクチャメニューから「カスタムアーキテクチャの作成」を選択すると起動される。
今回は「Dynamic」アーキテクチャを作成して、割り込み状態動作と通常状態動作を分けることにした。main関数のコールグラフから、main関数が呼び出している関数を含んだファイルを通常にアサインする。
この作業が一通り済んだら、マップされていないエンティティを表示して残ったファイルを割り込みにアサインする。
その場合はUnderstandではなく、関数や変数単位でアーキテクチャを解析できる「Lattix」などのツールを利用する必要がある。
Understandで扱うアーキテクチャは厳密なソフトウェアアーキテクチャというよりは、ソースコードを絞り込むフィルタとしての利用価値が高いだろう。例えば、最近変更された割り込み処理などは、CalendarとDynamicアーキテクチャを組み合わせることで、その処理を容易に特定することができる。
Understandでは、関数・変数レベルからファイルレベル、さらにはアーキテクチャレベルまで抽象度を上げてソースコードを解析することができる。要求仕様や設計仕様を文書化しておくことが基本であるが、実際の開発ではコードの文書化が十分でないことが多い。そうした場合、このツールは非常に強力なサポート機能を提供してくれるだろう。
Copyright © ITmedia, Inc. All Rights Reserved.
ハロウィーンの口コミ数はエイプリルフールやバレンタインを超える マーケ視点で押さえておくべきことは?
ホットリンクは、SNSの投稿データから、ハロウィーンに関する口コミを調査した。
なぜ料理の失敗写真がパッケージに? クノールが展開する「ジレニアル世代」向けキャンペーンの真意
調味料ブランドのKnorr(クノール)は季節限定のホリデーマーケティングキャンペーン「#E...
業界トップランナーが語る「イベントDX」 リアルもオンラインも、もっと変われる
コロナ禍を経て、イベントの在り方は大きく変わった。データを駆使してイベントの体験価...