55

C++コードのカバレッジを測定するためにgcovを使用しています。100%のカバレッジを実現したいのですが、理論的にはヒットできないコード行(実装する必要があるが呼び出されないメソッド、switchステートメントのデフォルトブランチなど)があるために妨げられています。 。)。これらの各ブランチにはassert( false );ステートメントが含まれていますが、gcovはそれらをヒットしていないものとしてマークします。

これらのブランチを無視するようにgcovに指示できるようにしたいと思います。ソースコードに注釈を付けることによって、または他のメカニズムによって、gcovにその情報を提供する方法はありますか?

4

4 に答える 4

46

lcovを使用してください。gcovの複雑さを隠し、優れた出力を生成し、テストごとに詳細な出力を可能にし、簡単なファイルフィルタリングと、レビュー済みの行のラインマーカーを備えています。

geninfo(1)から:

次のマーカーがgeninfoによって認識されます。

  • LCOV_EXCL_LINE
    • このマーカーを含む行は除外されます。
  • LCOV_EXCL_START
    • 除外されたセクションの開始をマークします。現在の行はこのセクションの一部です。
  • LCOV_EXCL_STOP
    • 除外されたセクションの終わりを示します。現在の行はこのセクションの一部ではありません。
于 2011-01-20T09:00:52.150 に答える
9

gcovrと呼ばれるツールを使用してgcovの出力を要約でき、(少なくともバージョン3.4から)lcovと同じ除外マーカーをサポートします。

この答えから:

次のマーカーがgeninfoによって認識されます。

  • LCOV_EXCL_LINE
    • このマーカーを含む行は除外されます。
  • LCOV_EXCL_START
    • 除外されたセクションの開始をマークします。現在の行はこのセクションの一部です。
  • LCOV_EXCL_STOP
    • 除外されたセクションの終わりを示します。現在の行はこのセクションの一部ではありません。

'LCOV'上記を'GCOV'またはに置き換えることもできます'GCOVR'。それらはすべて機能します。

于 2018-07-03T12:56:27.817 に答える
1

理論的にヒットできないコードパスを直接攻撃することによってgcovをシャットダウンするためだけに存在する、関連する関数の単体テストを紹介できますか?それらは単体テストであるため、状況の「不可能性」を無視する可能性があります。呼び出されない関数を呼び出したり、無効な列挙値を渡してデフォルトのブランチをキャッチしたりする可能性があります。

次に、NDEBUGでコンパイルされたバージョンのコードでのみこれらのテストを実行するか、テストフレームワークがサポートするものを問わず、アサートがトリガーされることをテストするハーネスでテストを実行します。

コードの機能要件を含む仕様ではなく、コードがそこになければならないと仕様が言うのは少し奇妙だと思います。特に、それはあなたのテストがそれらの要件をテストしていないことを意味します。これは要件を機能的に保つための理由と同じくらい良い理由です。assert個人的には、「無効な列挙値で呼び出された場合、関数は失敗します。呼び出し元は、リリースモードで無効な列挙値で関数を呼び出さない」ように仕様を変更したいと思います。またはそのようなもの。

おそらく現在それが言っていることは、「すべてのswitchステートメントはデフォルトのケースを持たなければならない」という線に沿っています。しかし、それは、コーディング標準がデッドコードを導入することによって観察可能な動作(少なくともgcovで観察可能)を妨害していることを意味します。コーディング標準はそれを行うべきではないので、機能仕様は可能であればコーディング標準を考慮に入れるべきです。

それができない場合は、ヒットできないコードをでラップし、#if !GCOV_BUILDgcovの利益のために別のビルドを実行することができます。このビルドはいくつかの要件に失敗しますが、コードの分析が正しいことを条件として、テストスイートが他のすべてをテストすることを望む自信を与えます。

編集:あなたは危険なコードジェネレーターを使用していると言いますが、ソースコードに注釈を付けることによって解決策も求めています。ソースを変更する場合、多くの場合、デッドコードを削除できますか?生成されたソースを変更することが理想的ではありませんが、ニーズは...

于 2010-08-24T13:23:53.370 に答える
0

私はこれが可能だとは思わない。Gcovはgccに依存して、カバレッジ出力を生成するための追加のコードを生成します。GCov自体はデータを解析するだけです。これは、Gcovがgccよりも優れたコードを分析できないことを意味します(そして、-Wallを使用し、到達不能として報告されたコードを削除したと思います)。

再配置可能関数はどこからでも呼び出すことができ、外部dllや実行可能ファイルでさえも呼び出すことができるため、コンパイラが呼び出されない再配置可能関数やこれらの関数の入力を知る方法はありません。

必要な情報を取得するには、おそらくいくつかの偽の静的分析ツールを使用する必要があります。

于 2010-08-24T10:35:50.330 に答える