Understand 5.1 バージョンアップ版では、C/C++ (Strict) モードで、以下のような依存関係の解析がサポートされました。
- 関数ポインターによる関数の呼び出し
- 関数テーブル(ジャンプテーブル)
- ポインター変数のアドレス操作
- コールバック関数
- ダブルポインタ
また、これらのポインター関連の依存関係は、Callsグラフを始め、
Called By/Cluster Call/Cluster Callby/ Butterfly/Internal Dependenciesなどのグラフィカルビューでも表示できるようになりました。
※シーケンス図(UML Sequence Diagram)には、5.1では未対応です。
解析手順
- メニューから[プロジェクト]-[プロジェクトの設定]を選択します。
- [言語]で、C/C++を選択し、”Strict”オプションをオンにします。
- 下記のオプションを設定します。
・[C++(Strict)]-[オプション]-[コンパイラ]
例)
Compiler: MSVC
Arch : x86_64
Vendor : pc
OS : windows
Env : msvc
・[C++(Strict)]-[オプション]-[言語規格]
例)
C : c11
C++ : c++11
・[C++(Strict)]-[インクルード]
・[C++(Strict)]-[マクロ]
- C/C++(Strict)モードによる解析は、実際のコンパイル環境に近い厳格な設定をおこなうことで、C/C++(Fuzzy)より精度の高い解析結果を得ることができます。オーバーロードやC++テンプレートの解析にも対応しています。
- ただし、インクルードパスやマクロの設定が不十分な場合、多数のエラーが検出され、C/C++(Fuzzy)より解析結果が劣る場合もあります。例えば、インクルードに関するエラーを解決した場合には、その先のコードでより多数のエラーが検出される場合もあります。
- gcc、g++準拠コンパイラでmake可能なプログラムの場合、Understand付属のBuildspyツールを用いて、makeの実行をトレースして収集した設定情報から、Understandプロジェクトを作成する方法があります。
詳細は、Understand Blogの以前の記事を参照ください。
関数ポインターによる関数の呼び出しの例
サンプルコード
#include <stdio.h>
void (*pf)(char*);
void func(char* c) {
printf("%s\n", c);
}
void foo1() {
pf = func;
}
void foo2() {
pf("hello");
}
void foo3() {
func("world");
}
int main() {
foo1();
foo2();
foo3();
return 0;
}
Understand 5.1の解析結果
- コンテキストメニュー[Function Pointer]-[Off]の場合


- 関数ポインター (pf) で呼び出される関数の実体 func も表示できるようになりました
- 関数ポインターを用いた関数呼び出し (‘call ptr’) を点線、関数ポインターへの関数アドレス代入 (‘use ptr’) を灰色の破線で区別して表示できるようになりました
- グラフのコンテキストメニュー[Function Pointer]-[Off]を選択した場合、関数ポインターへ関数アドレス代入しているだけの呼び出し関係(灰色の破線)を非表示にできるようになりました
Understand 4.0の解析結果


- 関数ポインター (pf) で呼び出される関数の実体 func を 解析することができませんでした
ポインター解析機能の改善は、以前から多くのユーザー様からご要望をいただき、実装されました。
まだ、一部対応されていない解析についても、今後のバージョンで引き続き改善を検討していく予定です。
改善されたポインター解析機能を是非、お試しください。