このセクションの内容
はじめに
C/C++test のマルチメトリクス カバレッジ解析機能は、スタンドアロンアプリケーションやライブラリを C/C++test の外で実行した際のコード カバレッジをモニターできます。
C/C++testには、以下のコンポーネントからなるスタンドアロンのカバレッジ パッケージが付属しています。
<INSTALL_DIR>/cpptestcc
- ビルド プロセスに統合し、カバレッジデータを収集できるようアプリケーションをインストゥルメントするカバレッジツールです。<INSTALL_DIR>/engine/coverage/runtime
- インストゥルメントされたアプリケーションに統合する必要があるカバレッジランタイム ライブラリです。
cpptestcc
によるカバレッジの収集は、以下の 3 つのフェーズで行われます。cpptestcc
ツールをビルドに統合し、アプリケーションをインストゥルメントする。- インストゥルメントされたコードを実行し、raw カバレッジ データを収集する。
- ビルトイン テスト コンフィギュレーションを使用して raw カバレッジ データを C/C++test にインポートし、C/C++test でカバレッジを確認する。
cpptestcc
のクイックスタート
- コンパイル コマンドを変更し、
--
を区切り文字としたコンパイラコマンドの接頭辞としてcpptestcc
実行モジュールを含めます。 例:元のコンパイル コマンド ライン
cc -I app/includes -D defines -c source.cpp
変更後のコンパイル コマンド ライン
cpptestcc -compiler gcc_9-64 -line-coverage -- cc -I app/includes -D defines -c source.cpp
cpptestcc
ツールを利用するには、少なくとも以下のパラメーターがコマンドラインに設定されている必要があります。- コンパイラ識別子
-compiler <COMPILER_ID>
- カバレッジメトリクス (例:
-decision-coverage
)その他のオプションについては、「cpptestcc コマンド ライン リファレンス」を参照してください。
- リンカー コマンドを変更し、C/C++test に付属のビルド済みカバレッジランタイム ライブラリへのパスを指定して、アプリケーションにこのライブラリを追加します。例:
元のコンパイル コマンド ライン
lxx -L app/lib app/source.o somelib.lib -o app.exe
変更後のコンパイル コマンド ライン
lxx -L app/lib app/source.o somelib.lib [INSTALL_DIR]/engine/coverage/runtime/lib/cpptest.lib -o app.exe
- アプリケーションをビルドします。コードをインストゥルメントする際、
cpptestcc
は.cpptest/cpptestcc
フォルダーを作成します。ここには、重要なカバレッジ関連データ (「カバレッジ マップ」) が保存されます。デフォルトでは、フォルダーは現在のコンパイルの作業ディレクトリに作成されます。-workspace <path>
オプションを使用してデフォルトの場所を変更できます。詳細は「cpptestcc コマンド ライン リファレンス」を参照してください。 - アプリケーションを実行します。
cpptest_results.clog
ファイルにカバレッジ データ (「カバレッジ ログ」) が保存されます。 - C/C++test がインストールされた IDE で、アプリケーションのすべてのソース ファイルを含む新規プロジェクトを作成します。
ファイルおよびすべてのパスに変更がないことを確認します。
- プロジェクトを選択し、IDE のメニューで [Parasoft] > [テスト コンフィギュレーション] > [Utilities] > [Load Application Coverage] をクリックしてカバレッジ データをインポートします (詳細は「カバレッジ データのインポート」を参照)。
- カバレッジ情報を参照します (「カバレッジ情報の参照」を参照)。
カバレッジ データのインポート
Load Application Coverage テスト コンフィギュレーションは、.cpptest/cpptestcc
フォルダーと cpptest_results.clog
ファイルの両方がデフォルトの場所にあると仮定します。場所をカスタマイズするには、テスト コンフィギュレーションの実行の詳細オプション ([実行] > [全般] > [実行の詳細]) で以下のように設定します。
- Coverage map files root location - デフォルト: ${project_loc}/.cpptest/cpptestcc
- Coverage log files - デフォルト: ${project_loc}/*.clog
デフォルトでは、Load Application Coverage テスト コンフィギュレーションは、すべてのサポート対象カバレッジ メトリクスの情報をロードしようとします。サポート対象カバレッジ メトリクスのリストをカスタマイズするには、 [実行] > [全般] > [実行の詳細] > [インストゥルメント モード] > [インストゥルメント機能]> [C/C++ コード カバレッジ メトリクス] に移動し、レポートしたいメトリクスを選択します。
コンパイル コマンドラインで cpptestcc
ツールに対して有効に指定したメトリクスと一貫性を保つよう推奨します。
MSBuild プロジェクトのアプリケーション カバレッジの収集
C/C++test には、カバレッジ解析を統合するよう MSBuild プロジェクトをすばやく再設定するスクリプトが付属しています。このスクリプトは、Visual Studio および CMake で生成された MSBuild プロジェクトの両方をサポートします。スクリプトはターゲットの .vcxproj ファイルのバックアップを作成し、要求された Parasoft 機能をすべてのビルド ターゲットで使用できるようにプロジェクトを変更します。
C/C++test には、インクルードされたツールを実行するための Python スクリプトが付属しています。スクリプトは次の場所にあります。
<CPPTEST_INSTALL_DIR>/engine/bin/cpptestpy.exe
<CPPTEST_INSTALL_DIR>/integration/msbuild/msbuild_cpptest.py
MSBuild プロジェクトのカバレッジを取得するには、次の操作を行います。
- 環境変数をセットアップします。
= の後にダブル クオーテーションを使用しないようにしてください。使用すると、文字列が誤って解釈されます。
CPPTEST_INSTALL_DIR
変数をセットアップします。set CPPTEST_HOME=<CPPTEST_INSTALL_DIR>
PATH
変数をセットアップします。set PATH=%PATH%;%CPPTEST_HOME\engine\coverage\runtime\bin
(CMake のみ) CMake を使用して MSBuild ファイルを生成します。
cd <PROJECT_DIR> mkdir build cd build cmake ..
統合スクリプトを実行します。
<cpptestpy.exe> <msbuild_cpptest.py> -c -f project.vcxproj
MSBuild を使用してプロジェクトをビルドします。
msbuild -t:Rebuild project.sln
カバレッジを収集するには、ビルド ディレクトリに移動してプロジェクトを実行します。
cd x64\Debug project.exe
現在の作業ディレクトリにカバレッジ情報を含む .clog ファイルが作成されます。
デフ ォルトのファイル名はcpptest_results.clog
です。カバレッジ レポートを生成します。
cpptestcli.exe \ -solution Sensor.sln \ -config "builtin://Load Application Coverage"
cpptestcc
コマンド ライン リファレンス
次のコマンドを実行すると、利用可能なオプションがコンソールに表示されます:
cpptestcc -help
以下のオプションがあります。
- -compiler <name|path>
- -list-compilers
- -include <file|pattern> and -exclude <file|pattern>
- -ignore <pattern>
- -line-coverage
- -optimized-line-coverage
- -function-coverage
- -optimized-function-coverage
- -statement-coverage
- -optimized-statement-coverage
- -block-coverage
- -optimized-block-coverage
- -path-coverage
- -decision-coverage
- -optimized-decision-coverage
- -simple-condition-coverage
- -optimized-simple-condition-coverage
- -mcdc-coverage
- -call-coverage
- -optimized-call-coverage
- -coverage-early-init
- -coverage-auto-finalization
- -optimized-coverage-corruption-detection
- -template-coverage
- -constexpr-coverage
- -coverage-data-variants
- -disable-auto-recovery-mode
- -workspace <path>
- -techsupport
- -psrc <file>
- -status
- -status-verbose
- -version
-compiler <name|path>
コード解析およびインストゥルメンテーションに使用するコンパイラ構成の名前を指定します。「コンパイラ」でサポート対象コンパイラの一覧を参照するか、-list-compilers
コマンド ライン オプションを使用してサポート対象コンパイラの一覧をコンソールに表示します。
例:
cpptestcc -compiler gcc_9-64
cpptestcc -compiler vc_11_0
設定ファイルの書式 (-psrc を参照): cpptestcc.compiler <name>
-list-compilers
サポート対象のすべてのコンパイラ コンフィギュレーション名を出力します。
設定ファイルの書式 (-psrc を参照): cpptestcc.listCompilers
-include <file|pattern> and -exclude <file|pattern>
指定されたパターンに一致するすべてのファイルをインストゥルメントのスコープに含めたり、スコープから除外します。
最終的なフィルタリングは、すべての include/exclude を指定された順序で適用した結果によって決まります。
次のワイルドカードがサポートされています。
?
- 任意の 1 文字*
- 任意の文字の連続
シェルが *
ワイルドカードをファイルまたはディレクトリのリストに展開するのを防ぐには、regex:
接頭辞を使用して値を指定します。
このオプションは複数回指定できます。
設定ファイルの書式 (-psrc を参照): cpptestcc.include <path|pattern>
例 1:
サンプル プロジェクト レイアウト:
<project root> + external_libs + src + include
プロジェクトのレイアウトが上記のとおりである場合、下記のコマンドは external_libs
ディレクトリのすべてのファイルをインストゥルメント スコープから除外します。
cpptestcc -include regex:*/<project root>/* -exclude regex:*/<project root>/external_libs <other command line options>
例 2:
サンプル プロジェクト レイアウト:
<project root> <sourcefiles>.cpp <headerfiles>.hpp
プロジェクトのレイアウトが上記のとおりである場合、下記のコマンドはヘッダー ファイルだけをインストゥルメントします (ソース ファイルはインストゥルメントされません)。
cpptestcc -include regex:*-exclude regex:*.cpp <remaining part of cmd>
-ignore <pattern>
処理時に無視されるソース ファイルを指定します。指定されたパターンに一致するファイルは、コンパイルはされますが、パースもインストゥルメントもされません。
-ignore と -exclude の比較
-ignore
オプションは、指定されたファイルを完全に処理から外すため、カバレッジ エンジンはファイルをパースしません。
-include/-exclude
フィルターはソース コードがパースされた後に適用されるため、ヘッダーファイルを個別にインストルメントするかしないか選択できます。
-ignore
オプションを使用すると、一部のコード セクション (たとえば外部ライブラリなど) のカバレッジ解析を無視することでカバレッジ解析ビルド時間のオーバーヘッドを短縮したり、処理中に問題 (パース エラーなど) の原因となる特定のファイルを無視できます。
次のワイルドカードがサポートされています。
?
- 任意の 1 文字*
- 任意の文字の連続
シェルが *
ワイルドカードをファイルまたはディレクトリのリストに展開するのを防ぐには、regex:
接頭辞を使用して値を指定します。
このオプションは複数回指定できます。
設定ファイルの書式 (-psrc を参照): cpptestcc.ignore <path|pattern>
例:
cpptestcc -ignore "*/Lib/*" <remaining part of cmd>
cpptestcc -ignore regex:*/file.c <remaining part of cmd>
cpptestcc -ignore c:/proj/file.c <remaining part of cmd>
cpptestcc -ignore "*/MyLib/*.cpp" -ignore file.cpp <remaining part of cmd>
-line-coverage
行カバレッジ メトリクスの収集を有効にします。
ランタイム カバレッジの結果は、コード実行と同時に結果ログに書き込まれます。これによってテスト対象コードの実行時間にオーバーヘッドが加わりますが、アプリケーションがクラッシュした場合でもカバレッジ データが収集されることを保証できます。
設定ファイルの書式 (-psrc を参照): cpptestcc.lineCoverage [true|false]
-optimized-line-coverage
最適化された行カバレッジの収集を有効にします。
ランタイム カバレッジの結果はメモリに格納され、アプリケーションの終了後またはユーザーが要求したときに結果ログに書き込まれます。これによってパフォーマンスが向上しますが、アプリケーションがクラッシュした場合は結果が失われます。
設定ファイルの書式 (-psrc を参照): cpptestcc.optimizedLineCoverage [true|false]
-function-coverage
関数カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.functionCoverage [true|false]
-optimized-function-coverage
最適化された関数カバレッジの収集を有効にします。設定ファイルの書式 (-psrc を参照):
cpptestcc.optimizedFunctionCoverage [true|false]
-statement-coverage
ステートメント カバレッジの収集を有効にします。設定ファイルの書式 (-psrc を参照):
cpptestcc.statementCoverage [true|false]
-optimized-statement-coverage
ステートメント カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.optimizedStatementCoverage [true|false]
-block-coverage
ブロック カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.blockCoverage [true|false]
-optimized-block-coverage
最適化されたブロック カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.optimizedBlockCoverage [true|false]
-path-coverage
パス カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.pathCoverage [true|false]
-decision-coverage
判断文 (Decision) カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.decisionCoverage [true|false]
-optimized-decision-coverage
最適化された判断文 (Decision) カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.optimizedDecisionCoverage [true|false]
-simple-condition-coverage
単純条件カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.simpleConditionCoverage [true|false]
-optimized-simple-condition-coverage
最適化された単純条件カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.optimizedSimpleConditionCoverage [true|false]
-mcdc-coverage
MC/DC カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.mcdcCoverage [true|false]
-call-coverage
コール カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.callCoverage [true|false]
-optimized-call-coverage
最適化されたコール カバレッジの収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.optimizedCallCoverage [true|false]
-coverage-early-init
アプリケーションのエントリ ポイント先頭でカバレッジ モジュールの初期化を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.coverageEarlyInit [true|false]
-coverage-auto-finalization
このオプションがオンの場合、アプリケーション終了時に自動的にカバレッジの収集を終了します。このオプションはデフォルトでオンです。
設定ファイルの書式 (-psrc を参照): cpptestcc.coverageAutoFinalization [true|false]
-optimized-coverage-corruption-detection
最適化されたカバレッジで破損検出アルゴリズムを有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.optimizedCoverageCorruptionDetection [true|false]
-template-coverage
テンプレート クラスおよび関数のカバレッジ収集を有効にします。
設定ファイルの書式 (-psrc を参照): cpptestcc.templateCoverage [true|false]
-constexpr-coverage
constexpr 関数のカバレッジを有効にします。
注意: この機能は、一部のコンパイラでだけ利用できます。詳細については「C++ 定数式のサポート」 を参照してください。
設定ファイルの書式 (-psrc を参照): cpptestcc.lineCoverage [true|false]
-coverage-data-variants
同じソース ファイルの異なるコンパイルに対応する複数のカバレッジ データを保存できるようにします。
デフォルトでは、cpptestcc は各ソース ファイルのカバレッジ データをビルドごとに 1 つ収集します。まれに、1 回のビルドで 1 つのソース ファイルが複数回コンパイルされるケースでは、このオプションを使用し、同じソース ファイルに対してコンパイルごとに異なる複数のカバレッジ データを保存できます。
このオプションは、同じソース ファイルを複数回コンパイルすることで、コードの競合が発生するシナリオをサポートしていません。
-disable-auto-recovery-mode
カバレッジ インストゥルメントの自動リカバリー モードを無効にします。
デフォルトでは、ファイルを正常にインストゥルメントできない場合、ビルドでは元の (インストゥルメントされていない) ファイルが使用されます。このオプションを有効にすると、インストゥルメントの問題が起きた場合、ビルドはエラーで失敗します。
-workspace <path>
コード解析およびインストゥルメント時にコードの構造に関する情報が保存されるカスタム ディレクトリを指定します。cpptestcli
ツールは、最終的なカバレッジ レポートを生成するためにこの情報を使用します。
デフォルトでは、情報は現在のコンパイルの作業ディレクトリに保存されます。コンパイルで複数の作業ディレクトリを使用する場合、すべてのカバレッジ データが同じ場所に保存されるよう、カスタム ディレクトリを指定することを推奨します。
設定ファイルの書式 (-psrc を参照): cpptestcc.workspace <path>
-techsupport
ワークスペースから収集された診断データを含むアーカイブを作成します (「-workspace」を参照)。アーカイブは現在の作業ディレクトリに保存されます。
例:
cpptestcc -techsupport
cpptestcc -techsupport -workspace path/to/workspace-dir
-psrc <file>
その他の cpptestcc
オプションを設定した設定ファイルへのパスを指定します。
デフォルトでは、cpptestcc
ツールは現在の作業ディレクトリまたはユーザーの HOME ディレクトリにある .psrc
ファイルを読み取ります。このオプションを使用すると、設定ファイルのカスタムの場所を指定できます。
オプションがコマンド ラインと設定ファイルの両方で設定されている場合、
cpptestcc
はコマンド ラインで指定された値を使用します。
-status
-status-verbose
エラーおよび警告情報、ファイル数など、ワークスペース (「-workspace」を参照) から収集された診断情報を表示します。
より詳細な情報を表示するには、-status-verbose
を使用します。
例:
cpptestcc -status
cpptestcc -status -workspace path/to/workspace-dir
cpptestcc -status-verbose
cpptestcc -status-verbose -workspace path/to/workspace-dir
-version
バージョン情報を出力します。
-help
ヘルプ メッセージを出力して終了します。
カバレッジ ランタイム ライブラリ
カバレッジ ランタイム ライブラリは、アプリケーション実行時にカバレッジ情報を出力するためにソース コード インストゥルメンテーションによって使用されるヘルパー関数およびサービスのコレクションです。インストゥルメントされたアプリケーションは、ライブラリなしではリンクできません。ランタイム ライブラリを最終的なテスト可能なバイナリにリンクする方法は、テスト対象プロジェクトのタイプに応じて複数あります。
インストゥルメントされたコードに基本的なサービスを提供するほか、ライブラリはコード カバレッジ ソリューションを特定の開発環境向けに調整するためにも使用されます。たとえば、テスト対象の組み込みデバイスと開発ホストの間でカバレッジ結果を送受信するために非標準的なトランスポートをサポートする場合などです。
ビルド済みのバージョンとカスタマイズされたビルド
C/C++test にはランタイム ライブラリのビルド済みのバージョンが付属しています。これらのバージョンは、C/C++test がインストールされているのと同じプラットフォームでの使用に適しています。多くの場合、ネイティブで開発されたアプリケーションは、ランタイム ライブラリのビルド済みのバージョンを使用してコード カバレッジを収集できます。
クロスプラットフォームのアプリケーションを開発するユーザーは、適切なクロス コンパイラおよび場合によってはリンカーを使用してカバレッジ ランタイム ライブラリのカスタム ビルドを用意する必要があります。C/C++test にはコード カバレッジ ランタイム ライブラリのソース コードが付属しています。
カバレッジ ランタイム ライブラリのカスタム ビルドの準備に必要なプロセスは、通常は、カバレッジ ランタイム ライブラリのソース コードをコンパイルすることだけです。状況によっては、一部のソース コードをインストールしてコード カバレッジを特定の開発プラットフォーム向けに変更する必要がある場合もあります。このプロセスについては、後のセクションで説明します。
ビルド済みランタイム ライブラリの使用
C/C++test には以下のバイナリ ファイルが含まれています。
Windows (x86 および x86-64)
ファイル | 説明 |
---|---|
<INSTALL_DIR>/engine/coverage/runtime/lib/cpptest.a | Cygwin GNU GCC で使用される 32 bit 版のインポート ライブラリです。リンク コマンド ラインに追加します。 |
<INSTALL_DIR>/engine/coverage/runtime/lib/cpptest64.a | Cygwin GNU GCC コンパイラで使用される 64 bit 版のインポート ライブラリです。リンク コマンド ラインに追加します。 |
<INSTALL_DIR>/engine/coverage/runtime/lib/cpptest.lib | Microsoft Visual C++ コンパイラで使用される 32 bit 版のインポート ライブラリです。リンク コマンド ラインに追加します。 |
<INSTALL_DIR>/engine/coverage/runtime/lib/cpptest64.lib | Microsoft Visual C++ コンパイラで使用される 64 bit 版のインポート ライブラリです。リンク コマンド ラインに追加します。 |
<INSTALL_DIR>/engine/coverage/runtime/bin/cpptest.dll | 32 bit 版の動的リンク ライブラリです。PATH 環境変数に <INSTALL_DIR> /engine/coverage/runtime/bin を追加します。 |
<INSTALL_DIR>/engine/coverage/runtime/bin/cpptest64.dll | 64 bit 版の動的リンク ライブラリです。PATH 環境変数に <INSTALL_DIR> /engine/coverage/runtime/bin を追加します。 |
ファイル | 説明 |
---|---|
<INSTALL_DIR>/engine/coverage/runtime/lib/libcpptest.so | 32-bit 版の共有ライブラリです。リンク コマンド ラインに追加します。<INSTALL_DIR> /engine/coverage/runtime/lib should be added to LD_LIBRARY_PATH |
<INSTALL_DIR>/engine/coverage/runtime/lib/libcpptest64.so | 64-bit 版の共有ライブラリです。リンク コマンド ラインに追加します。LD_LIBRARY_PATH に <INSTALL_DIR>/engine/coverage/runtime/lib を追加します。 |
あらかじめ用意されていない形式のランタイム ライブラリを使用する必要がある場合、特定の開発環境の要件に合わせたカバレッジ ランタイム ライブラリのカスタム ビルドを用意します。詳細については、「ランタイム ライブラリのカスタマイズ」を参照してください。
リンカー コマンド ラインとの統合
カバレッジ ランタイム ライブラリをテスト対象アプリケーションと統合するリンク プロセスでは、通常はリンカー コマンド ラインの変更が必要であり、場合によっては実行環境の変更も必要です。このセクションでは、C/C++test に付属しているビルド済みのバージョンを使用する場合にリンク プロセスを変更する方法を説明します。
Windows Cygwin GNU GCC コンパイラ用の静的ライブラリの場合
- ビルド スクリプト内のリンカー コマンド ラインを特定します。
- ビルド スクリプトを変更し、リンカー コマンド ラインの任意の場所にカバレッジ ランタイム ライブラリを指定します。できればすべてのオブジェクト ファイルの後に指定します。
Microsoft Visual C++ コンパイラ用の動的リンク ライブラリの場合
- ビルド スクリプト内のリンカー コマンド ラインを特定します。
ビルド スクリプトを変更し、リンカー コマンド ラインの任意の場所にカバレッジ ランタイム ライブラリを指定します。できればすべてのオブジェクト ファイルの後に指定します。例:
$(LXX) $(PRODUCT_OBJ) $(OFLAG_EXE)$(PROJ_EXECUTABLE) $(LXXFLAGS) $(SYSLIB) $(EXECUTABLE_LIB_LXX_OPTS) <INSTALL_DIR>/engine/coverage/runtime/lib/cpptest.lib
PATH
環境変数にlib
ディレクトリへのパスが追加され、テスト対象プログラム起動時にライブラリを発見できるようになっていることを確認します。cpptest.dll
(またはcpptest64.dll
) ファイルを実行モジュールと同じディレクトリ、またはテスト対象アプリケーションの起動時に動的リンク ライブラリを検索するその他の場所にコピーすることを検討するとよいでしょう。
GNU GCC コンパイラ用共有ライブラリの場合
- ビルド スクリプト内のリンカー コマンド ラインを特定します。
ビルド スクリプトを変更し、リンカー コマンド ラインの任意の場所にカバレッジ ランタイム ライブラリを指定します。できればすべてのオブジェクト ファイルの後に指定します。例:
$(LXX) $(PRODUCT_OBJ) $(OFLAG_EXE)$(PROJ_EXECUTABLE) $(LXXFLAGS) $(SYSLIB) $(EXECUTABLE_LIB_LXX_OPTS) -L <INSTALL_DIR>/engine/coverage/runtime/lib -lcpptest
-L
および-lcpptest
オプションが追加されていることに注意してください。- テスト対象実行モジュールが共有ライブラリへのパスを見つけられるよう、
LD_LIBRARY_PATH
環境変数にlib
ディレクトリへのパスが追加されていることを確認します。
ランタイム ライブラリのカスタマイズ
以下の条件に当てはまる場合、ランタイム ライブラリをカスタマイズする必要がある可能性があります。
- 別の形式のバイナリ ファイルが必要である。
- 結果を転送するためにデフォルト以外の通信チャネルを有効にする
- 結果を転送するために通信チャネルのカスタム 実装をインストールする
- デフォルトではサポートされないマルチスレッド アプリケーションのサポートを有効にする
- マルチスレッド アプリケーションをサポートするためのカスタム実装をインストールする
- 複数のインストルメントされたバイナリが 1 つのログ ファイルに書き込んでいる
ライブラリのソース コードの構造
C/C++test に付属しているランタイム ライブラリのソース コードは、[INSTALL_DIR]
/engine/coverage/runtime
ディレクトリにあります。次の表は、使用方法の説明です。
コンポーネント | 説明 |
---|---|
include | ライブラリのインクルード ファイルがあるディレクトリです。 |
src | ライブラリのソース コードがあるディレクトリです。 |
Makefile | ランタイム ライブラリのビルド用に提供されている基本的な Makefile です。 |
target | 一般的に利用されている開発環境用にランタイム ライブラリを準備するためのコンパイラ固有のオプションが設定された Makefile インクルード ファイルのセットがあるディレクトリです。 |
channel | サポート対象の通信チャネル用構成を含む Makefile インクルード ファイルのセットがあるディレクトリです。 |
通信チャネルサポートの切り替え
ランタイム ライブラリはさまざまな通信チャネル経由でのデータ収集をサポートしています。使用される通信チャネルは開発環境に依存します。多くの場合、結果を 1 つまたは複数のファイルに格納するのが適切ですが、TCP/IP ソケットまたは RS232 による転送が必要な場合もあります。cpptest.c
ライブラリ ソース ファイルをコンパイルするときに専用のマクロに値を設定することで、特定の通信チャネルを有効にできます。値を設定するには、コンパイル コマンド ラインに -D<MACRO>
を追加します。次の表は、通信チャネル制御マクロの一覧です。
チャネル | 説明 |
---|---|
CPPTEST_NULL_COMMUNICATION | 空の実装です。このチャネルを有効にすると、結果は送信されません。初回のテスト ビルドおよびデバッグに適しています。 |
CPPTEST_FILE_COMMUNICATION | ファイルベースの実装です。ANSI C のファイル I/O インターフェイスが使用されます。このチャネルを有効にすると、結果はローカル ドライブのファイルに書き込まれます。 次の詳細設定マクロがあります。
|
CPPTEST_SPLIT_FILE_COMMUNICATION | ファイルベースの実装です。ANSI C のファイル I/O インターフェイスが使用されます。このチャネルを有効にすると、結果はローカル ドライブのファイルに書き込まれます。 以下のマクロを使ってこのチャネルを設定できます。
一連のすべてのファイルが同じディレクトリに置かれるようにします。
|
CPPTEST_UNIX_SOCKET_COMMUNICATION | TCP/IP ソケット ベースの実装です。POSIX API が使用されます。このチャネルを有効にすると、結果は指定された TCP/IP ポートに送信されます。次の詳細設定マクロがあります。
|
CPPTEST_WIN_SOCKET_COMMUNICATION | 上記と同じですが、MS Windows API が使用されます。 |
CPPTEST_UNIX_SOCKET_UDP_COMMUNICATION | CPPTEST_UNIX_SOCKET_COMMUNICATION と同じですが、UDP ベースの実装です。 |
CPPTEST_RS232_UNIX_COMMUNICATION | RS232 ベースの実装です。POSIX API が使用されます。このチャネルを有効にすると、結果は指定された RS232 システム デバイスを経由して送信されます。次の詳細設定マクロがあります。
|
CPPTEST_RS232_WIN_COMMUNICATION | CPPTEST_RS232_UNIX_COMMUNICATIONと同じですが、MS Windows API が使用されます。 |
CPPTEST_RS232_STM32F103ZE_COMMUNICATION | STM32F103x USART ベースの実装です。STM Cortex ライブラリ インターフェイスが使用されます (ST/STM32F10x/stm32f10x.h ヘッダーが必要です)。 |
CPPTEST_HEW_SIMIO_COMMUNICATION | Renesas HEW シミュレーター固有の実装です。 |
CPPTEST_LAUTERBACH_FDX_COMMUNICATION | Lauterbach TRACE32 ベースの実装です (FDX が使用されます)。 |
CPPTEST_ITM_COMMUNICATION | ARM CoreSight ITM ユニット ベースの通信です。CMSIS ヘッダー ファイルが必要です。 |
CPPTEST_CUSTOM_COMMUNICATION | カスタム実装のための空のテンプレートを有効にします。 |
提供されている Makefile でカバレッジ ランタイム ライブラリをビルドする場合、[INSTALL_DIR]/
engine/coverage/runtime/channel
ディレクトリにある make 設定ファイルを使用できます。
カスタム通信チャネルのサポートをインストール
お使いの開発環境に合う通信チャネルの実装がない場合、カスタム実装を使用できます。次の手順は、ランタイム ライブラリをカスタマイズして通信チャネルのカスタム実装を使用する方法を説明しています。
[INSTALL_DIR]/engine/coverage/runtime/src/cpptest.c
をコピーし、編集用に開きます。セクション 1.13 "Custom Communication Implementation" の場所を探します。
カスタム通信の実装セクションには、4 つの異なるメソッドのための空のテンプレートがあります。関数 説明 void cpptestInitializeStream(void)
この関数は通信チャネルの初期化を行います。たとえば、ソケットの作成および接続や、UART デバイスの初期化などを行います。 void cpptestFinalizeStream(void)
この関数は、通信チャネルの後処理を行います。たとえば、TCP/IP ソケットのクローズなどを行います。 int cpptestSendData(const char *data, unsigned size)
この関数は、データ バッファーからのサイズ バイトを送信します。 void cpptestFlushData(void)
この関数は、データをフラッシュします。フラッシュの意味は、トランスポートタイプによって異なります。一部の実装では、あまり意味がない可能性もあります。その場合、関数は空のままにしておきます。 - お使いの環境の要件に合わせてこれらのメソッドを実装します。
- コンパイル コマンド ラインに次のマクロ定義を付加して
cpptest.c
をコンパイルします。"-DCPPTEST_CUSTOM_COMMUNICATION"
- 生成されたオブジェクトファイルでは不十分な場合、要求に合わせてさらにファイルを処理できます (共有ライブラリを作成するなど)。
マルチスレッド API サポートの切り替え
ランタイム ライブラリはマルチスレッド アプリケーションをサポートします。POSIX、Windows、および VxWorks API がサポートされます。cpptest.c
をコンパイルする際にコマンド ラインに -D<MACRO>
を追加することで特定のマルチスレッド API のサポートを有効化できます。次の表は、マルチスレッド API サポート制御マクロの一覧です。
マクロ | 説明 |
---|---|
CPPTEST_NO_THREADS | 空の実装です。カバレッジ ランタイムはマルチスレッド アプリケーションと共に使用できません。 |
CPPTEST_WINDOWS_THREADS | Windows のマルチスレッド API 実装です。 |
CPPTEST_UNIX_THREADS | POSIX のマルチスレッド API 実装です。 |
CPPTEST_VXWORKS_THREADS | VxWorks のマルチスレッド API 実装です。 |
カスタム スレッド API サポートのインストール
サポート対象外のマルチスレッド API を使用するマルチスレッド アプリケーションと共に C/C++test のカバレッジ エンジンを使用する場合、お使いのマルチスレッド API と共に動作するようランタイム ライブラリをカスタマイズできます。それには、次の手順を行う必要があります。
[INSTALL_DIR]/engine/coverage/runtime/src/cpptest.c
をコピーし、編集用に開きます。セクション 2.5 "Custom Communication Implementation" の場所を探します。
カスタム通信の実装セクションには、4 つの異なるメソッドのための空のテンプレートがあります。関数 説明 static int cpptestLock(void)
この関数は、カバレッジ ツール ランタイム ライブラリ内の処理が同期されることを保証します。あるスレッドがランタイム ライブラリ サービスへのアクセスをロックした場合、その間はアトミックな処理が行われ、他のスレッドがランタイム ライブラリ サービスを使用できないことを意味します。ロックが解放されると、他のスレッドがランタイム ライブラリ サービスを使用できるようになります。 static int cpptestUnlock(void)
ランタイム ライブラリ サービスを解放します。 お使いの環境の要件に合わせてこれらのメソッドを実装します。
コンパイル コマンド ラインに次のマクロ定義を付加して
cpptest.c
をコンパイルします。"-DCPPTEST_CUSTOM_THREADS"
生成されたオブジェクト ファイルが十分ではない場合、ニーズに合わせてさらにファイルを編集できます (たとえば共有ライブラリを作成するなど)。
複数のインストルメントされたバイナリが 1 つのログ ファイルに書き込んでいる
1 つのカバレッジ ログ ファイル (.clof) が並行して実行される複数のインストゥルメントされたバイナリによって使用される場合、ランタイム ライブラリで複数プロセスのサポートを有効にする必要があります。
複数プロセスのサポートを有効にするには、コンパイル コマンド ラインに次のマクロを追加して cpptest.c
をコンパイルします。"-DCPPTEST_MULTI_PROCESSES_LOG=1"
ランタイム ライブラリのビルド
C/C++test にはランライム ライブラリのビルド プロセスを簡略化するシンプルな Makefile (「ライブラリのソース コードの構造」を参照) が付属しています。しかし、ソース コードがすでにビルド プロセス用に最適化されているため、多くの場合、付属の make ファイルは必要ありません。唯一の必須の手順は、メイン cpptest.c
ソース ファイルをコンパイルすることです。生成されたオブジェクト ファイルをさらに処理する必要があるかどうかは、個々の開発環境や、ランタイム ライブラリを共有ライブラリとして提供するかなどの要件によります。
付属の Makefile を使用したランタイム ライブラリのビルド
<INSTALL_DIR>
/engine/coverage/runtime
をローカル ディレクトリにコピーします。- コンパイル フラグを変更する必要がある場合 (たとえばクロスコンパイラやランタイム ライブラリの再設定を強制する定義を追加するなど)、ターゲット サブディレクトリに新しく make 設定ファイルを用意します。作業を簡単にするため、既存のターゲット設定ファイルをコピーし、ニーズに合わせて内容を変更できます。
次のコマンド ラインを呼び出すと、単一のオブジェクト
cpptest.<OBJ_EXT>
を含むサブディレクトリbuild
が作成されます。それを使用してインストゥルメントされたアプリケーションとリンクできます。make TARGET_CFG=<target config file name> CHANNEL_FILE=<channel config file name>
コマンドは次のようになります。
make TARGET_CFG=gcc-static.mk CHANNEL_FILE=channel/unix-socket.mk
チャネル タイプを指定することもできます。
make TARGET_CFG=gcc-static.mk CHANNEL_TYPE=unix-socket
- カバレッジ ランタイム ライブラリを共有ライブラリ、動的リンク ライブラリ、またはその他のバイナリ形式でリンクする必要がある場合、目的に合わせて Makefile をカスタマイズするか、カスタム ビルドをセットアップする必要があります。
ランタイム ライブラリのユーザー ビルド
カバレッジ ランタイム ライブラリのユーザー ビルドをセットアップするには、次の操作を行います。
<INSTALL_DIR>
/engine/coverage/runtime/src/cpptest.c
から任意の場所に cpptest.c ファイルをコピーします。- 「Customizing the Runtime Library」の説明に従って、任意のカスタマイズを行います。
- 任意のビルド システムをセットアップします (例: IAR Embedded Workbench プロジェクトまたはその他のソース コード ビルダー)。
コンパイル フラグを変更し、コンパイラ インクルード フラグ (通常は
-I
) に次の値を含めます。-I <INSTALL_DIR>/engine/coverage/runtime/include
- 必要な設定があれば追加します (よくあるのは
-D
) 。例:-DCPPTEST_FILE_COMMUNICATION -DCPPTEST_NO_THREADS
- ビルダーを実行します (たとえば、IDE でビルド コマンドを選択します)。
- 結果として作成されたオブジェクト ファイルの場所を確認し、インストゥルメントされたアプリケーションとリンクします。
コード カバレッジのトラブルシューティング
エラーや警告の情報など、カバレッジ ワークスペースの診断情報を表示する方法
カバレッジ ワークスペースにはインストゥルメントされたコード、対応する静的カバレッジ データとともに、コードがインストゥルメントされたときに生成されたログや設定ファイルが保存されています。-status
オプションを使用すると、エラーや警告の情報、ファイル数など、カバレッジ ワークスペースから収集された診断データを表示できます。より詳細な情報を表示するには、-status-verbose
を使用します。
デフォルトでは、現在のディレクトリにあるカバレッジ ワークスペースにある診断データが検索されます。-workspace オプションを使用して別のワークスペースの場所を指定することもできます。
例:
cpptestcc -status
cpptestcc -status -workspace /path/to/workspace
cpptestcc -status-verbose
cpptestcc -status-verbose -workspace /path/to/workspace
カバレッジ ワークスペースの診断情報を Parasoft 製品サポートに送信する方法
-techsupport
オプションを使用してテクニカル サポート パッケージを作成できます。ログ ファイル、正常にインストゥルメントされなかった可能性があるファイルのプリプロセス済みソースコードなど、すべての診断データを含む .zip ファイルが作成されます。
デフォルトでは、現在のディレクトリにあるカバレッジ ワークスペースにある診断データが検索されます。-workspace オプションを使用して別のワークスペースの場所を指定することもできます。
例:
cpptestcc -techsupport
cpptestcc -techsupport -workspace /path/to/workspace
アプリケーション カバレッジのレポートを生成したとき、見つからないソース ファイルがあった場合
カバレッジ レポートを生成するとき、C/C++test はコード カバレッジ収集のためにインストゥルメントされたすべてのファイルが元の場所にあることを必要とします。C/C++test が元の場所でファイルを見つけられなかった場合、カバレッジ レポートは不完全になります。そのような場合、C/C++test は警告メッセージとともに見つからないファイルのリストを表示します。
別の場所に移動されたファイルのカバレッジ データを含むカバレッジ レポートを生成するには、CPPTEST_COVERAGE_SRC_ROOT
環境変数を使用して元のパスをローカル (現在の) パスにマッピングします。
CPPTEST_COVERAGE_SRC_ROOT=/original/path1=/local/path1;/original/path2=/local/path2;...
元のパスの中で '*' をワイルドカードとして使用できます。例:
CPPTEST_COVERAGE_SRC_ROOT=/*/path=/local/path
リスト ファイル (*.lst) でパス マッピングのリストを指定し、ファイルの場所を値として設定することもできます。例:
CPPTEST_COVERAGE_SRC_ROOT=/path/mapping.lst
*.lst ファイルの各項目は個別のエントリとして扱われます。
例
次の例では、カバレッジ収集のために foo.cpp ファイルがインストゥルメントされた後、別の場所に移動されました。
- インストゥルメントされたファイルの元の場所:
/home/server/project-123/foo.cpp
- インストゥルメントされたファイルの現在の場所 (レポート生成時の場所):
/home/devel/project/foo.cpp
foo.cpp ファイルのカバレッジ データを含むカバレッジ レポートを生成するには、次の操作を行います。
- CPPTEST_COVERAGE_SRC_ROOT 環境変数を使用してパスのマッピングを定義します。例:
> export CPPTEST_COVERAGE_SRC_ROOT=/home/server/project-123=/home/devel/project
- カバレッジ レポートを生成します。
コード カバレッジ収集のためにコードをインストゥルメントできなかった場合にビルドを失敗させる方法
デフォルトでは、ファイルを正常にインストゥルメントできない場合、ビルドでは元の (インストゥルメントされていない) ファイルが使用され、警告が表示されます。カバレッジ収集のためにインストゥルメントできないソース ファイルがあった場合にビルドを失敗させるには、-disable-auto-recovery-mode
オプションを使用します。
例
cpptestcc -disable-auto-recovery-mode [...]
1 回のビルドで複数回コンパイルされるファイルのカバレッジを収集する方法
デフォルトでは、ビルドに含まれるソース ファイルごとに 1 つのコンパイルのカバレッジ データが保存されます。結果として、まれに 1 回のビルドでソース ファイルが複数回コンパイルされる場合、最後のコンパイルのカバレッジ データだけが保存されます。結果として、レポートを生成すると、次の警告とともに不完全なカバレッジ レポートが生成される場合があります。「コードの構造に関する一部の情報が現在のワークスペースに存在しないため、カバレッジ レポートは不完全です。」1 つのソース ファイルに対して複数のカバレッジ データ (コンパイルごとに 1 つのバリアント) を保存するには、-coverage-data-variants
オプションを使用します。
1 つのソース ファイルの異なるコンパイルがコードの競合 (たとえば、1 つの関数の異なるバリアントなど) を発生させないよう注意してください - このようなケースはサポートされません。
例
cpptestcc -coverage-data-variants [...]