3

背景:
特定のプロジェクトでは、100 を超えるファイルに約 2,000 の関数が含まれています。関数はコード メモリの 2 つのバンク (fast_mem と slow_mem) に分割されます。しかし現在、fast_mem 領域が制限されているため、新しいコードの変更に対応するにはスペースが不足しています。

コード レビューの一環として、fast_mem の一部の関数には呼び出し元がないことが判明しました。しかし、関数のリストは膨大すぎて、1 つずつ手動でチェックすることはできません。

質問:
質問ですが、プロジェクト内のすべての関数の呼び出し元を一覧表示できるツールはありますか? これで、呼び出し元を持たない fast_mem 内の関数を削除できます。

コードブラウジングには ctags と一緒に cscope を使用します。ただし、これには関数名を手動で入力する必要があります。完全なリストを取得する方法を自動化できますか?
また、呼び出し元グラフ機能を備えた Doxygen も試しました。ただし、結果はそれほど快適ではありません。

4

4 に答える 4

0

奇妙な関数ポインタゲームが進行していないと仮定しましょう。次に、十分に使用されていないcflowを分割できます。

http://www.gnu.org/software/cflow/

-rフラグを使用して「リバースインデックス」を生成します。すべての関数のリストが表示され、その後に呼び出された場所が表示されます。複数のファイルをフィードできます。

于 2011-11-10T19:25:35.553 に答える
0

cppcheckのような静的コード分析ツールを使用できます。パラメータを指定して呼び出すと、 --enable=unusedFunction未使用の関数について警告されます。

于 2011-11-10T19:25:58.223 に答える
0

Scientific Toolsworks を使用しています

于 2011-11-10T19:04:32.977 に答える
0

コンパイラが最近の GCC である場合 (またはクロスコンパイラとして GCC 4.6 に切り替えることができる場合) は、GCC プラグインまたはMELT拡張機能を開発して調べることができます。

もちろん、たとえば関数ポインタを使ってトリックを行っている場合 (たとえば、関数ポインタに対する移植性のないポインタ演算)、元の質問は決定できません。

実際、関数ポインタを使用している場合、多くの場合、合理的な唯一の言い方は、同じシグネチャの関数にしか到達できないということです。

fast_memそしておそらくプロジェクトは十分に重要なので、コンパイラーをカスタマイズして&の間のより良い (自動または半自動) トレードオフを行うslow_mem価値があります。これは通常、GCC プラグインまたは MELT 拡張機能の優れたケースです (ただし、GCC をカスタマイズするには内部 GCC 表現を理解する必要があるため、数時間ではなく数日または数週間の作業が必要です)。そうしてください(あなたの質問はいくつかの奇妙なシステムに非常に特有のものだからです)。

于 2011-11-10T19:20:30.780 に答える