リンカーのフィードバックを使って未使用の関数や変数をリストにするのは簡単ですが、未使用のマクロ定義& 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. 別のクレートで定義されたマクロを使用するにはどうすればよいですか?
- 3. Clojureのfnで未定義シンボルを使用するにはどうすればよいですか? Clojureので
- 4. JsInteropで未定義のグローバルオブジェクトを使用するにはどうすればよいですか?
- 5. マクロはどのように定義されていますか?
- 6. フォントに定義されている文字を検出するにはどうすればよいですか?
- 7. jQueryを "未定義"にするにはどうすればいいですか?
- 8. $(未定義)をどうすればいいですか?
- 9. マクロを使用するアーキテクチャによって、呼び出し規約が異なる関数を定義するにはどうすればよいですか?
- 10. jQuery:if文を使用して「未定義」エラーを取り除くにはどうすればよいですか
- 11. テンプレート引数をバインドしないtr1 :: unordered_mapのマクロ/ typedef/etcを定義するにはどうすればよいですか?
- 12. カスタム設定を検出するにはどうすればよいですか?
- 13. ModelsimまたはQuestasimの使用時に、どのSystemverilogマクロが定義されているかを知るにはどうすればよいですか?
- 14. 未定義ではないフォームからreq.bodyを取得するにはどうすればよいですか?
- 15. bashで未定義の変数をエラーとして扱うにはどうすればよいですか?
- 16. VC++プロジェクトで環境変数/マクロを定義するにはどうすればよいですか?
- 17. reactjsでオブジェクトの長さの未定義アイテムを0にするにはどうすればよいですか?
- 18. typedefとテンプレートの未定義シンボルですか?
- 19. MySQLでビューとユーザ定義関数でActiveRecordを使用するにはどうすればよいですか?
- 20. プロトタイプで未定義とnullを渡すにはどうすればよいですか?
- 21. コードで使用するマクロをすばやく確認するにはどうすればよいですか?
- 22. 構文を使用してC++ 11でメソッドポインタをtypedefするにはどうすればよいですか?
- 23. 未定義のキーを持つObjectの値を取得するにはどうすればよいですか?
- 24. IE8で未定義の値をチェックするにはどうすればよいですか?
- 25. componentWillReceivePropsイベントで未定義のnextPropsを解決するにはどうすればよいですか?
- 26. コードで未定義の変数を修正するにはどうすればよいですか?
- 27. PHPで「未定義変数」の通知をトラブルシューティングするにはどうすればよいですか?
- 28. JavaScriptで未定義のJSONデータを処理するにはどうすればよいですか?ここ
- 29. AndroidスタジオでNDKビルドの「未定義リファレンス」を解決するにはどうすればよいですか?
- 30. 固定寸法を使用せずにスペースを定義するにはどうすればよいですか?
*コンパイラ*はプリプロセッサの後に実行されるため、コンパイルできません。 – chris
ブラウジングコードとグロッピング以外の解決策は、与えられたマクロとマクロを使わずに 'gcc -E'を実行し、結果を比較することだと思います。それらが同じであれば、マクロはコード内で使用されていませんでした。しかし、おそらくもっと良い方法があります。 –
@ EricFinn、それは最初の考えで私にはあまりにも悪くはありません。私はそれが大規模なコードベースでは実現可能ではないことを知っています。 – chris