3

私はperlスクリプトを使用してCのコールグラフプログラムを実装しています。'objdump'の出力を使用して関数ポインタのコールグラフを解決する方法を知りたいですか?さまざまなコールグラフアプリケーションが関数ポインタをどのように解決しますか?関数ポインターは実行時に解決されますか、それとも静的に実行できますか?

編集 コールグラフは、プログラムの静的評価のサイクルをどのように解決しますか?

4

2 に答える 2

2

関数ポインタを使用することは、実行時に呼び出す実際の関数を選択する方法であるため、一般に、静的に実際に何が起こるかを知ることはできません。

ただし、呼び出すことができるすべての関数を調べて、何らかの方法でそれらを表示することはできます。多くの場合、コールバックには十分に一意の署名があります(常にではありません)。

もっとうまくやりたい場合は、ソースコードを分析して、最初にどの関数がポインターに割り当てられているかを確認する必要があります。

于 2010-12-04T17:24:09.223 に答える
2

コールステートメントが明示的にBに言及している場合、A-calls-Bのコールグラフを作成するのは簡単です。お気づきのように、間接的なコールを処理するのははるかに困難です。

優れた静的分析ツールは、さまざまなスキームを使用して、プログラムデータフロー(プロシージャ間およびプロシージャ内["グローバル"])全体にポインタ割り当て/コピー/算術演算を伝播することにより、ポインタ変数の内容の推定を形成します。 ")。

そのような見積もりがないと、ポインターに何が含まれているのかわからないため、有用な予測を行うことができません(まあ、どこにでも行くという究極の控えめな見積もりを使用できますが、その解決策はすでに拒否されていると思います)。

当社のDMSSoftwareReengineering Toolkitは、静的制御/データフロー/ポイントツー/コールグラフ分析を備えており、Cコードの巨大なシステム(約2500万行)に適用され、そのようなコールグラフを作成しました。これを行うための機構はかなり複雑ですが、コンパイラの文献の高度なトピックで見つけることができます。これをPerlで実装したいとは思わない。

ソースコードがある場合、これは簡単です。少なくとも、コードとは何か、そうでないものは確実にわかっているからです。これをオブジェクトコードで実行しようとしています。つまり、データを削除することすらできません。

于 2010-12-04T19:55:52.007 に答える