2013-05-15 12 views
8

リンカーのフィードバックを使って未使用の関数や変数をリストにするのは簡単ですが、未使用のマクロ定義& typedefをどのように検出できますか?コードを行ごとにブラウズし、プロジェクト全体でgit grepを参照する必要がありますか?未使用のマクロ定義とtypedefを検出するにはどうすればよいですか?

+7

*コンパイラ*はプリプロセッサの後に実行されるため、コンパイルできません。 – chris

+3

ブラウジングコードとグロッピング以外の解決策は、与えられたマクロとマクロを使わずに 'gcc -E'を実行し、結果を比較することだと思います。それらが同じであれば、マクロはコード内で使用されていませんでした。しかし、おそらくもっと良い方法があります。 –

+0

@ EricFinn、それは最初の考えで私にはあまりにも悪くはありません。私はそれが大規模なコードベースでは実現可能ではないことを知っています。 – chris

答えて

7

CおよびC++プログラムの静的解析ツールには、未使用のプリプロセッサマクロのチェックが含まれている場合があります。

たとえば、PC-Lintを参照してください。

別の可能性として、特定のインクルードファイルに行き、#ifdef 0を使用して、マクロの大部分を削除し、ある種の分割と征服アルゴリズムを使用してコンパイラエラーを確認します。

しかし、私は静的解析ツールがソースコードサイズが大きくなるにつれてはるかに優れたアプローチになると期待します。

+0

PC-Lintはプロフェッショナルな開発者のコ​​ンピュータに*置かれるべき素晴らしいツールです。 –

+3

Windozeに触れることのない何百万という開発者を除いて。 –

+1

FlexlintはPC-Lintの代替品です。 –

2

未使用のマクロについては、coanをご覧ください。この作業に役立つオプションがあります。 about pageから:

与えられた設定の下でアクティブなプリプロセッサディレクティブにはどのようなシンボルが現れますか?

(プリプロセッサディレクティブは、偽#ifのスコープ内にないとアクティブになります)。あなたがアプリでCソースに興味があると再度​​考えてみると、次のコマンドでファイル名と行番号を使ってこれらのシンボルのリストを表示することができます:

$>コタン記号--recurse --locate - C --filterアクティブ--once、Hアプリ

それはコードのうちエアコン塊を除去するためのオプション(#if 0や友人)と、Cプリプロセッサに対処するための他の多くの便利な機能を備えています。私は#defineのすべてのシンボルとすべての#ifdefまたはdefinedのシンボルとフレンドを収集するためにそれを使用します。私はシンボルの2つのコレクションを並べ替えて一意にして、それをdiffします。これはタイプミスを見つけるのにとても良い方法です。それから私はそれらのヒストグラムを別々に取って、最も頻度の低いものから始め、リストの上に向かって作業を進めます。

未使用のtypedefについては、これは別の課題です。 OpenGrokまたはGNU Globalのような相互参照型プログラムを使用できますが、これはあまり自動ではありません。

7

ソースファイルで定義されているマクロについては、-Wunused-macros gcc/clangフラグを試してみてください。 -Wunused-local-typedefsもgccにあります。

関連する問題