このセクションでは、C/C++test を使って実行時エラー検出を行う方法について説明します。このセクションの内容:

概要

C/C++test の実行時エラー検出機能を利用すると、メモリ リーク、NULL ポインター、未初期化メモリ、バッファー オーバーフローといった重大な実行時のエラーをユニット レベルまたはアプリケーション レベルで特定することができます。  実行時エラー検出は、エンタープライズ開発にも組み込み開発にも適しています。 

この実行時エラー検出機能は柔軟であるため、たとえば組込みシステムのような標準ではないメモリ 割り当てモデルを使用している場合でも、実行時のメモリ解析を行うことができます。また、実行時 エラーを検出するためのインストゥルメントは軽量であるため、ターゲット基板、シミュレーター、 またはホスト上で組込みテストを実行できます。 

収集された問題は、問題の理解と解決に必要な詳細情報と共にレポートされます (メモリ ブロック サイズ、配列インデックス、割り当て/解放のスタック トレースなど)。カバレッジ メトリクスが追跡され、ユーザーがテスト作業の範囲を計測して増加するのに役立ちます。

アプリケーション レベルでの実行時エラー検出

アプリケーションの実行に対して実行時エラー検出を行うには、次の操作を行います。

C/C++test は、インストゥルメントしたアプリケーション実行ファイルを作成して実行します。選択されたコンフィギュレーションに応じて、カバレッジ 統計およびアプリケーション実行中に発見されたメモリ エラーのどちらか、あるいは両方がレポートされます。 

ビルドすると実行ファイルになるプロジェクトの場合、実行時エラー検出によってアプリケーションの実行を監視することができます。ライブラリ プロジェクトを監視するには、main() 関数の定義のコードをプロジェクトに追加する必要があります。このコードは、テスト対象ライブラリの使用シナリオの一部をシミュレートします。たとえば、#ifdef PARASOFT_CPPTEST を使ってテスト対象のライブラリ ソース ファイルにそのような main() 関数を追加することができます。

単体テスト実行中の実行時エラー検出

単体テストの実行中に実行時エラーを検出するには、次の操作を行います。

実行時メモリ解析が有効な状態でテスト用実行モジュールが生成され、テストが実行されます。テストの実行が完了すると、通常の単体テストのタスクに加えて、メモリの問題がレポートされます。


実行時エラーの検出のタスクは、それぞれルールの違反として次の場所にレポートされます。違反メッセージ、場所、およびスタック トレースがレポートされます。

実行時エラー検出の違反の抑制

静的解析の違反と同じように、実行時エラー検出の違反も抑制することができます。GUI から抑制するか、または // parasoft-suppress <ruleid> ["<reason>"] を使ってソース コードから抑制できます。

詳細については 「静的解析違反メッセージの抑制」 を参照してください。

実行時エラー検出オプションのカスタマイズ

テスト コンフィギュレーションでオプションを変更して、実行時エラー検出の動作をカスタマイズすることができます。

[実行] > [全般] タブでは次のオプションを設定できます。

[実行] > [実行時] タブでは次のオプションを設定できます。

実行時エラー検出のルール

テスト対象のコードに対してメモリ関連の問題を発見するために、C/C++test には次の実行時エラー検出ルールが用意されています。

ルール ID説明
RUN-MEM-DANG

ダングリング ポインターを使用してメモリにアクセスしない

このルールは、すでに解放済みのメモリを指すポインターの使用に関する問題を検出します。

RUN-MEM-WILD

ワイルド ポインターを使用してメモリにアクセスしない

このルールは、有効なメモリ バッファーを指していないポインターの使用に関する問題を検出します。

RUN-MEM-NULL

NULL ポインターを使用してメモリにアクセスしない

このルールは、NULL ポインターの使用に関する問題を検出します。

RUN-MEM-RANGE

有効範囲外のポインターを使用してメモリにアクセスしない

このルールは、有効範囲外のバッファーへのアクセス (9 つの要素を持つバッファーの 10 番目の要素へのアクセスなど) に関する問題を検出します。

RUN-MEM-UNINIT

未初期化メモリを読み込まない

このルールは、割り当て済みだが初期化されていないメモリの読み込みに関する問題を検出します。

RUN-MEM-FREEDANG

ダングリング ポインターを解放しない

このルールは、すでに解放済みのメモリ ポインターを解放しようとすることに関する問題を検出します。

RUN-MEM-FREEIL

不正なポインターに対して free を使用しない

このルールは、malloc で割り当てられた有効なメモリ ブロックを指していないポインターを free で解放しようとすることに関する問題を検出します。

RUN-MEM-FREELOC

ローカル メモリ ポインターに対して free を使用しない

このルールは、ローカル メモリ ブロックを指すポインターを free で解放しようとすることに関する問題を検出します。

RUN-MEM-FREEGLOB

グローバル メモリ ポインターに対して free を使用しない

このルールは、グローバル メモリ ブロックを指すポインターを free で解放しようとすることに関する問題を検出します。

RUN-MEM-FREENULL

NULL ポインターに対して free を使用しない

このルールは、NULL ポインターを free で解放しようとすることに関する問題を検出します。

RUN-MEM-MAZERO

サイズに 0 を指定して malloc を使用しない

このルールは、malloc を使用してサイズがゼロのバッファーを割り当てることに関する問題を検出します。

RUN-MEM-CAZEROELEM

要素数に 0 を指定して calloc を使用しない

このルールは、calloc を使用して要素数がゼロのバッファーを割り当てることに関する問題を検出します。

RUN-MEM-CAZEROSIZE

要素サイズに 0 を指定して calloc を使用しない

このルールは、calloc を使用してサイズがゼロの要素を持つバッファーを割り当てることに関する問題を検出します。

RUN-MEM-RAILL

不正なポインターに対して realloc を使用しない

このルールは、malloc で割り当てられた有効なメモリ ブロックを指していないポインターに対してrealloc を使用することに関する問題を検出します。

RUN-MEM-RALOC

ローカル メモリ ポインターに対して realloc を使用しない

このルールは、ローカル メモリ ブロックを指すポインターに対して realloc を使用することに関する問題を検出します。

RUN-MEM-RAGLOB

グローバル メモリ ポインターに対して realloc を使用しない

このルールは、グローバル メモリ ブロックを指すポインターに対して realloc を使用することに関する問題を検出します。

RUN-MEM-RAZERO

新しいサイズに 0 を指定して realloc を使用しない

このルールは、realloc を使用してサイズがゼロのバッファーを割り当てることに関する問題を検出します。

RUN-MEM-LEAK

メモリ リークを避ける

このルールは、メモリ リークを検出します。malloc、 realloc、または calloc で割り当てられたメモリを指すポインターが失われた場合に違反をレポートします。

RUN-MEM-CORRUPT

メモリ破壊を避ける

このルールは、メモリ破壊を検出します。malloc、 realloc、または calloc で割り当てられたメモリ ブロックが、割り当て解除処理中に予期しない方法で上書きされた場合に違反をレポートします。

実行時エラー検出のテスト コンフィギュレーション

C/C++test で利用できるテスト コンフィギュレーションの詳細については、「ビルトイン テスト コンフィギュレーション」を参照してください。

テストの準備がすべて整っているかを検証する場合、[Build Application with...] テスト コンフィギュレーションを使用することを推奨します。 ビルドされるアプリケーションが (たとえば組込みテストのために) 外部で実行されるかどうかを検証するためのテスト コンフィギュレーションもあります。この場合、完全なフローはビルド、デプロイ/実行 (手動)、およびログの参照から構成されます。 

[Build and Run Application with...] テスト コンフィギュレーションは、テスト コンフィギュレーションで指定されたコマンドラインを使ってアプリケーションをビルドして実行する場合に使用します。 

より具体的に言うと、次のようになります。

実行時エラー検出の既知の制限事項