私のプロジェクトには、それぞれに多数のグローバル関数を含む多数の C ソース ファイルがあります。これらの多くは、呼び出し元からまったく参照されなくなりました。これらの関数のうち、誰にも参照されていないものを特定する簡単な方法はありますか?
VC で生成されたマップファイルが役に立ちそうです。しかし、関数名がいつどのようにマップ ファイルにリストされているのか正確にはわかりません。
私のプロジェクトには、それぞれに多数のグローバル関数を含む多数の C ソース ファイルがあります。これらの多くは、呼び出し元からまったく参照されなくなりました。これらの関数のうち、誰にも参照されていないものを特定する簡単な方法はありますか?
VC で生成されたマップファイルが役に立ちそうです。しかし、関数名がいつどのようにマップ ファイルにリストされているのか正確にはわかりません。
プログラムに関する多くの指標を提供するCCCC (無料のオープン ソース) を使用できます。もう 1 つのオプションは、Coverity (無料ではありません) です。
この質問は、次の質問と重複している可能性があります:レガシー C/C++ プロジェクトでのデッド コード検出
マップファイルは何の役にも立たないと思います。私が見た他のマップ ファイルと同じように、シンボルが使用されている場所 (もしあれば) は示さず、シンボルが定義されている場所のみを示します。できることはdumpbin
、オブジェクト ファイルに対して実行することです。dumpbin /relocations
たとえば、実際には、再配置が必要な可能性のあるアドレスを持つシンボルのすべての使用が表示されます (実際には、静的な有効期間を持つ関数と変数)。次に、出力に対して通常のツールを使用して、関心のある関数がそこにあるかどうかを判断します。(主に Unix で作業してきた者として、私は CygWin をインストールして使用
grep
していました。Windows のさまざまな Unix ツールに相当するネイティブのツールについては詳しくありません。)
dumpbin /symbols
オブジェクトファイルごとに出力を
解析し、定義したすべての関数の名前を取得してから、の出力をdumpbin
/relocations
使用して、使用する関数のリストを表示し、最後に 2 つの diff を実行します。(Microsoft は の出力dumpbin
を使いにくくするために手を尽くしているようですが、それでもそれほど難しくはありません。どの行を無視すればよいかを知っておく必要があります。)