Understand 5.1 の新機能・改善点 – ポインター解析機能の強化

Understand 5.1 バージョンアップ版では、C/C++ (Strict) モードで、以下のような依存関係の解析がサポートされました。
  • 関数ポインターによる関数の呼び出し
  • 関数テーブル(ジャンプテーブル)
  • ポインター変数のアドレス操作
  • コールバック関数
  • ダブルポインタ

また、これらのポインター関連の依存関係は、Callsグラフを始め、
Called By/Cluster Call/Cluster Callby/ Butterfly/Internal Dependenciesなどのグラフィカルビューでも表示できるようになりました。

※シーケンス図(UML Sequence Diagram)には、5.1では未対応です。


解析手順

  1. メニューから[プロジェクト]-[プロジェクトの設定]を選択します。
  2. [言語]で、C/C++を選択し、”Strict”オプションをオンにします。
  3. 下記のオプションを設定します。
・[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 を 解析することができませんでした

ポインター解析機能の改善は、以前から多くのユーザー様からご要望をいただき、実装されました。
まだ、一部対応されていない解析についても、今後のバージョンで引き続き改善を検討していく予定です。
改善されたポインター解析機能を是非、お試しください。

タイトルとURLをコピーしました
Close Bitnami banner
Bitnami