リンカーのフィードバックを使って未使用の関数や変数をリストにするのは簡単ですが、未使用のマクロ定義& typedefをどのように検出できますか?コードを行ごとにブラウズし、プロジェクト全体でgit grepを参照する必要がありますか?未使用のマクロ定義とtypedefを検出するにはどうすればよいですか?
答えて
CおよびC++プログラムの静的解析ツールには、未使用のプリプロセッサマクロのチェックが含まれている場合があります。
たとえば、PC-Lintを参照してください。
別の可能性として、特定のインクルードファイルに行き、#ifdef 0
を使用して、マクロの大部分を削除し、ある種の分割と征服アルゴリズムを使用してコンパイラエラーを確認します。
しかし、私は静的解析ツールがソースコードサイズが大きくなるにつれてはるかに優れたアプローチになると期待します。
PC-Lintはプロフェッショナルな開発者のコンピュータに*置かれるべき素晴らしいツールです。 –
Windozeに触れることのない何百万という開発者を除いて。 –
FlexlintはPC-Lintの代替品です。 –
未使用のマクロについては、coanをご覧ください。この作業に役立つオプションがあります。 about pageから:
与えられた設定の下でアクティブなプリプロセッサディレクティブにはどのようなシンボルが現れますか?
(プリプロセッサディレクティブは、偽#ifのスコープ内にないとアクティブになります)。あなたがアプリでCソースに興味があると再度考えてみると、次のコマンドでファイル名と行番号を使ってこれらのシンボルのリストを表示することができます:
$>コタン記号--recurse --locate - C --filterアクティブ--once、Hアプリ
それはコードのうちエアコン塊を除去するためのオプション(#if 0
や友人)と、Cプリプロセッサに対処するための他の多くの便利な機能を備えています。私は#define
のすべてのシンボルとすべての#ifdef
またはdefined
のシンボルとフレンドを収集するためにそれを使用します。私はシンボルの2つのコレクションを並べ替えて一意にして、それをdiffします。これはタイプミスを見つけるのにとても良い方法です。それから私はそれらのヒストグラムを別々に取って、最も頻度の低いものから始め、リストの上に向かって作業を進めます。
未使用のtypedefについては、これは別の課題です。 OpenGrokまたはGNU Globalのような相互参照型プログラムを使用できますが、これはあまり自動ではありません。
ソースファイルで定義されているマクロについては、-Wunused-macros
gcc/clangフラグを試してみてください。 -Wunused-local-typedefs
もgccにあります。
- 1. 別のマクロ定義の中からAntマクロを呼び出すにはどうすればよいですか?
- 2. Clojureのfnで未定義シンボルを使用するにはどうすればよいですか? Clojureので
- 3. フォントに定義されている文字を検出するにはどうすればよいですか?
- 4. $(未定義)をどうすればいいですか?
- 5. jQuery:if文を使用して「未定義」エラーを取り除くにはどうすればよいですか
- 6. テンプレート引数をバインドしないtr1 :: unordered_mapのマクロ/ typedef/etcを定義するにはどうすればよいですか?
- 7. 未定義ではないフォームからreq.bodyを取得するにはどうすればよいですか?
- 8. カスタム設定を検出するにはどうすればよいですか?
- 9. VC++プロジェクトで環境変数/マクロを定義するにはどうすればよいですか?
- 10. typedefとテンプレートの未定義シンボルですか?
- 11. MySQLでビューとユーザ定義関数でActiveRecordを使用するにはどうすればよいですか?
- 12. IE8で未定義の値をチェックするにはどうすればよいですか?
- 13. JavaScriptで未定義のJSONデータを処理するにはどうすればよいですか?ここ
- 14. PHPで「未定義変数」の通知をトラブルシューティングするにはどうすればよいですか?
- 15. この未定義のインデックスエラーを修正するにはどうすればよいですか? Jquery Ajax to PHP
- 16. Notice:未定義のプロパティ - PHPでこのメッセージを避けるにはどうすればよいですか?
- 17. node.jsのejsで未定義のプロパティを調べるにはどうすればよいですか?
- 18. 未定義のインデックスを削除するにはどうすればよいですか?
- 19. v8エラーの未定義参照を修正するにはどうすればよいですか?
- 20. JavaScriptでは[未定義、未定義、未定義]と新しいArray(3)はどのように異なるのですか?
- 21. JSP/Javaを使用してモバイル(iOSとAndroid)を検出するにはどうすればよいですか?
- 22. 構文を使用してC++ 11でメソッドポインタをtypedefするにはどうすればよいですか?
- 23. ファイルセットが定義されているかどうかを検出するには?
- 24. データソースのレイアウトを定義するにはどうすればよいですか?
- 25. Mac OS Xで使用するライブラリを定義するにはどうすればよいですか?
- 26. Google App Engineで使用する領域を定義するにはどうすればよいですか?
- 27. 動的列に使用するデータ型を定義するにはどうすればよいですか?
- 28. 操作の定義でマクロの中からマクロを使用するには?
- 29. with文で使用できるPythonクラスを定義するにはどうすればよいですか?
- 30. プラグインでJPATH_BASEを定義するにはどうすればよいですか?
*コンパイラ*はプリプロセッサの後に実行されるため、コンパイルできません。 – chris
ブラウジングコードとグロッピング以外の解決策は、与えられたマクロとマクロを使わずに 'gcc -E'を実行し、結果を比較することだと思います。それらが同じであれば、マクロはコード内で使用されていませんでした。しかし、おそらくもっと良い方法があります。 –
@ EricFinn、それは最初の考えで私にはあまりにも悪くはありません。私はそれが大規模なコードベースでは実現可能ではないことを知っています。 – chris