8

C++ コードでインスタンス化されていないテンプレートを見つける最良の方法は何ですか?

テンプレートを多用するコード ベースがあります。もちろん、テスト カバレッジが高いことを確認したいと考えています。使用されているすべてのコードについて、これは を使用して非常にうまく機能しgcovます。

ただし、使用されていないテンプレートは、によって実行不可として報告されgcovます。

いくつかのグーグル検索の後、g++これらのテンプレートのコードを強制的に発行する方法はないようです (これは論理的なものであり、コンパイラーはどのように型を推測する必要がありますか?) また、インスタンス化されていないテンプレート コードを gcov に認識させる方法もないようです。実行可能なコードとして。

GCC-ftest-coverage -fprofile-arcsインスツルメンテーションによって生成されたファイルを拡張できる「すぐに使える」ものはありますか? GCCのgcov オプションのドキュメントによると、テンプレート関数本体全体を 1 つのブロックとしてマークするだけでおそらく十分でしょう。

編集(背景情報): ヘッダーのみのテンプレート ライブラリに取り組んでいます。ここでの私の目的は、未使用/テストされていない機能を見つけることです。

コード カバレッジに欠陥があることは承知していますが、インスタンス化されていないコードを見つけることは、コードのテストを改善するための非常に重要なステップです。現在、各関数の先頭にチェックポイント マクロを配置しています。(file, line)テスト モードでは、渡されたチェックポイントのグローバル セットに のペアを挿入するコードに展開されます。テストを実行した後、手動ですべてのファイルを読み取り、到達したチェックポイントを使用可能なすべてのチェックポイントのセットと比較します。

インスタンス化されていないコードを見つけることは重要です。たとえば、直感的でない C++ テンプレートの優先順位の動作のために、読者や作成者でさえ使用されると予想されるデッド コードがどこかにある可能性があります。

4

3 に答える 3

2

私たちのC++ Test Coverageツール (GCC ベースではない) は、あなたの観点からこれを正しく行っていると思います。

コンパイラがソース コードを認識する前に、ソース コードを計測します。テンプレート内のコードは、テンプレートが使用されるかどうかに関係なく、「カバレッジ プローブ」を取得します。ツールのテスト カバレッジ表示部分は、すべてのプローブがどこにあるかを認識しています。テンプレート コードがインスタンス化されていない場合、明らかに実行できないことが報告されます。「カスタム」マクロの挿入やその他の、ええと、BSを行う必要はありません。

欠点は、いくつかの異なる型によってパラメーター化されたテンプレートがあり、インスタンス化された異なる型に対してテンプレート メソッド m1 と m2 が実行される場合、m1 と m2 のカバレッジが 100% になることです (結局、インストルメント化されたテンプレートを実行したことになります)。これが悪いことかどうかは明らかではありません。これがどのように解釈されるかというだけです。

于 2011-04-26T00:10:25.253 に答える
1

さて、私はGCCにあまり精通していないので、退屈で非常に時間がかかる解決策がありますが、少なくともうまくいきます! :)
このテストは、テンプレート コードの一部のエラーが実際のインスタンス化まで検出されないという事実に依存しています。つまり、依存する名前がテンプレート パラメータに実際に存在しない場合です。

template<class T>
struct Example{
  typedef typename T::_123344_non_existent_type instantiation_test;
};

そのような typedef をすべてのテンプレートに追加してから、コンパイルします。コンパイラがエラーを表示するすべての構造体/クラス/関数からそれを削除し、コードが最終的にコンパイルされたときにそのような型定義をまだ含むすべてのテンプレートはインスタンス化されません。または、運が悪く、そのような を定義するタイプもありますが、_123344_non_existent_typeその責任を負う同僚をリンチします。;)

于 2011-04-25T21:38:12.503 に答える