4

非常に大規模な C++ プログラムがあり、特定の低レベル関数を特定のコンテキストから、または特定の予防措置を講じている場合にのみ呼び出す必要があります。これらの低レベル関数のどれがはるかに高レベルの関数によって呼び出されているかを示すツールを探しています。これは、おそらく注釈付きのソース出力で、いくつかのドロップダウンまたはラベル付けで IDE に表示されることを望みますが、コールグラフを手動で検索するよりも簡単な方法が役立ちます。

これは静的解析の問題であり、プロファイラーは役に立ちません。

私は主に Mac で作業しています。Linux も問題ありません。Windows でしか利用できないものがある場合は、それで十分です。

アップデート

コールグラフを持っているだけでは、「foo() は x() y() または z() の呼び出しを引き起こす可能性がありますか」という質問に答えるのがそれほど速くはなりません。(または、コールグラフツールについて何かが欠けています。おそらく、解決策を得るためにトラバースするプログラムを作成する必要がありますか?)

4

2 に答える 2

1

Scientific Toolworks の "Understand"ツールは、C および C++ の呼び出しグラフを生成できるはずです。

Doxygenはコール グラフも生成すると思われます。

私はこれらのいずれについても経験がありませんが、いくつかの厳しい意見があります。私は別のツールのベンダーであることを心に留めておく必要があるため、この意見は大目​​に見てください。

私は、250,000 の関数を持つ大規模な C システム (2,500 万行) のかなり正確なコール グラフを作成した経験があります。

現実的なコール グラフを作成する際に遭遇する問題の 1 つは、間接関数呼び出しと、C++ のオーバーロードされたメソッド関数呼び出しです。大規模なシステムでは、これらの両方がたくさんあります。FOO が呼び出されたときに何が呼び出されるかを判断するには、コンパイラ/言語がオーバーロードされた呼び出しをどのように解決するかについて、ツールがセマンティックを深く理解する必要があります。大きなシステムで。これらを合理的に正しく取得しないと、コール グラフに多くの誤検出 (たとえば、A が B を呼び出す偽の主張) が含まれることになり、大規模な誤検出は惨事になります。

C++ の場合、完全なコンパイラ フロント エンドに相当するものが必要です。Understanding も Doxygen もこれを持っていないため、C++ のオーバーロード/Koenig ルックアップ規則を実際に理解する方法がわかりません。私が知っている限り、Understand も Doxygen も、間接的な関数呼び出しについて推論しようとはしません。

当社のDMS Software Reengineering Toolkitは、 C 言語の正確なフロント エンドを使用して、間接関数ポインターを使用しても、C の呼び出しグラフを適切に作成します。

私たちはC++ 言語の正確なフロント エンドを持っており、オーバーロードの解決を正しく行います (C++ 委員会が同意している範囲で、彼らの発言と個々のコンパイラの動作を理解しています [彼らは常に同意するとは限りません])。この情報を表示する Doxygen のようなものがあります。現在、C++ の関数ポインター分析はありませんが、取り組んでいます (メソッドに完全な制御フロー グラフがあり、これは大きな一歩です)。

CLANGにはコールグラフを計算するためのオプションがあることを理解しています.Clangは本質的に一連のコンポーネントで実装されたC ++コンパイラであるため、オーバーロードで正確であると期待しています. 関数ポインターを分析するためにClangが何かを行うとしたら、私は何をするのかわかりません。

于 2011-12-14T17:23:49.300 に答える
1

OS Xにも存在するはずのLLVMを使用するClang Static Analyzerが存在します。実際、これはXcodeに統合されているという意見です。とにかく、GUIが存在します。

さらに、コール グラフを生成できる LLVMパスがいくつかありますが、これが必要かどうかはわかりません。

于 2011-12-14T16:34:41.620 に答える