2009-12-10 7 views
19

私はC++プロジェクトから使用されていない関数を削除しようとしています。時間が経つと肥大化し、私はまったく使われていない機能を削除しようとしています。C++プロジェクト内で関数が呼び出されているかどうかを確認しますか?

私はすべてのプロジェクトをVisual Studioのソリューションファイルに入れていますが、必要に応じて別のIDE用のプロジェクトファイルを生成できます(これはVisual Studioでタグ付けされていません)。

このようなことはありますか?ソースを分析して呼び出されない関数を教えてくれる場所。私はここでいくつかの質問でPC-Lintが言及しているのを見ましたが、これはそうではありません。

私が実際にやりたいことは、各関数の "Find all references"を呼び出し、呼び出されていない関数を削除することですが、これを手動で行うには時間がかかりすぎます。

+0

+1私は同じ問題を抱えていた:レガシープロジェクトは、プロジェクト/ソリューションファイルがチェックされていませんどのようにして、それらのプロジェクトをOSの検索(そしてWindowsの検索がうまくいく)に依存することなくリンクすることができます... –

+0

私は誰かがこのためにオープンソースのソリューションの名前を考え出すことができます。 – BlueTrin

+0

このような場合、通常、関数の実装(本文)をコメントアウトして、このリンクがあるかどうかを確認してください。 – valdo

答えて

9

除外したい関数宣言の前に__declspec(deprecated)を使用してください。その関数がコンパイル時に実際に使用されると、コンパイル警告がスローされます。

+0

私はこれについて知りませんでしたが、私は間違いなくこのことを調べます。 – Joe

+0

これは私が最終的に使用しようとしている解決策ですので、これを答えとしてマークします。 _declspec(dllimport deprecated)が機能するので、うまく動作します。私は#define _declspec(dllimport)vs _declspec(dllexport)ので、私はちょうどdllごとに1つの場所を変更し、何が表示されるか見ることができます。 すべてがボディを持っているため、少なくとも1回は非推奨となります。私はPythonを使用してコンパイラからの出力を解析し、各クラス/関数が何回使われなくなったかのヒストグラムを作成します。それから、私は、最も低い数字を持つものをより注意深く見る。 – Joe

0

私は最も簡単な方法は、関数(またはクラス、変数、不要と思われるもの)を削除してコンパイルするかどうかを確認することです。関数が使用されている場合は、再構築中のある時点でコンパイルエラーまたはリンクエラーが発生します。

オーバーロードされた関数や特殊なテンプレートなどのように、宣言ではなく定義を削除する必要があります。コンパイルして別のテンプレートにリンクしてエラーを発生させずにプログラムの動作を変更します。定義を削除すると、コンパイラは引き続き宣言を認識しますが、リンカーはそれをリンクできません。

宣言されていますが、定義されていない項目は、リンカーが絶対にリンクしようとしないため、使用しないとエラーになります。

+2

指が動的に読み込まれません... –

+1

関数を知るのに十分なプロジェクトの構造を知っていれば、動的に参照される(つまり、実行時に関数のシンボルルックアップがある)場合は、これが最善の策だと思います。それは私がしていることです。 – Omnifarious

+4

プロジェクトをビルドするのに30分かかることはありません。 –

3

コードカバレッジツールが必要ですね。これにはwikipedia articleのリストがあります。

+3

なぜですか?テストコードは存在しないかもしれません。 – reinierpost

+1

テストコードはありません。コードカバレッジツールは機能しません。すべてのケースに当てはまるかどうかわからないからです。 – Joe

+0

コードカバレッジツールは必ずしも特定のテストコードを必要としません。一部は実稼働環境で通常のコードで実行できます。 –

3

優秀な(そして無料の)ソースモニタ静的解析ツールhttp://www.campwoodsw.com/からは、メソッドの呼び出し回数をカウントすることができます。

編集:ねじ込みのための私の夜と思われる。コールメトリックは実際に私が思ったことを実際には行いません。それでも、SMは優れたツールなので、人々の注目を集めてほしいと思っています。

+0

私はソースモニターを試しましたが、メソッドの呼び出し統計はこのメソッドが呼び出された回数ではなく、このメソッドが行っている他のメソッドへの呼び出しの数であると思います。 私が間違っている場合は、誰かが私を修正してください。 – BlueTrin

+0

はい、あなたは正しいようです。それは申し訳ありません - 私は実際に自分自身を使用するメトリックではありません。 –

1

コードが単純であれば、十分な静的解析が有効です。しかし、C++は非常にコンテキストに敏感です:/。だから私は個人的にはその地域の道具を探すことさえしようとしないだろう。少なくともCLANGがC++に完全に準拠するまでは、D

私はあなたが単体テストをしたいと思っています。ランタイムプロファイルを生成するコードをコンパイルするVisual Studioを入手し、関数名(スクリプト言語を使用)を生成されたプロファイルアプリケーションですべてのユースケース(手動または単体テストのいずれか)をカバーしている場合は、使用頻度の低い(または使用されていない)関数を識別できる必要があります。次に、マーク1の眼球を使用してソースベースをトリミングすることができます。

かかわらず、手動でそれをやってようなものは何もありません:D

1

Visual Studioは、「と呼ばれる-よる」機能ごとを示す、コールグラフを生成することができますが。あなたがVisual Studioを使いたくない場合、Doxygenは同じことをします。

しかし、これらのメソッドはどちらも、ポインタを介して呼び出される関数を検出することはできませんが、通常は手動でチェックするのが簡単です。

+0

+1は関数ポインタを呼び出すためのものですが、私はいつも手動でチェックするのは簡単だとは思っていません。私が考えているのは、すべての機能が静的にリンクされていない限り、実際に書かれたモジュールに関連する可能性のある制御パスの数が指数関数的であるため、安全性を100%確実に取り除くことは不可能かもしれないということです。 –

+0

私は、関数ポインタがしばしばコードベース内で広く使用されることはないということを基にして、通常は*簡単だと言いました。私は努力の面で、必ずしも複雑ではないことを意味しました。私はコードにある程度慣れていると仮定しています。例えばあなたのコードであれば、関数ポインタを使用したかどうか、どこで関数ポインタを使用したのか分かります。 – Clifford

+0

フェア十分です。私は本当にそこにあなたの口に単語を入れました。 –

1

どの関数が使用されているかを動的に知りたい場合は、(vC++)コンパイラでcallcapフックを挿入し、それらを使用して使用情報をダンプすることができます。

これは、実行中に入力されたすべてのコードを(実行がどのように到着したかにかかわらず)見ることができるため、静的解析に基づくアプローチに役立ちます。

ビジュアルスタジオのコールプロファイルフックについては、http://msdn.microsoft.com/en-us/library/ms254291(VS.80).aspxを参照してください。

2

私は数学的には、これは一般的なケースではできないと確信しています。あなたが再帰と関数ポインタ(またはファーストクラス関数)を許せば、停止問題はかなり簡単に減少します。

確か

、これは...あなたが対処する必要はありませんが、あなたがそれに当接知っておくべきケースも

+0

それは私がクリフォードの答えに私のコメントを書いていた点です。あなたは答えを投稿した、あなたはポイントを得る:) .. +1 –

関連する問題