ホーム > ユーザーサポート > FAQ カバレッジマスターwinAMS

FAQ / カバレッジマスターwinAMS

カバレッジ計測に関する問題

102_01 : 全ての分岐が実行可能なデータを与えているにも関わらず、C1カバレッジ結果が100%になりません。

【質問】
カバレッジマスターwinAMSを使用して分岐を持つ関数の単体テストを行いましたが、全ての分岐が実行可能な入力データを与えているにも関わらず、C1カバレッジ結果が100%になりません。なぜでしょうか?

【回答】
カバレッジマスターwinAMSは、マイコンシミュレータを使用して実際のアセンブラコードを実行します。カバレッジ計測は、実行されたアセンブラコードに対応するCソースをマーキングする方法でカバレッジを計測しています。C1カバレッジ計測は、コンパイラが生成したアセンブラコードを実行した結果から、分岐が実行されたかの判断を行っています。

このため、例えば下記の様な場合に、カバレッジマスターが分岐実行を検出できず、C1カバレッジが計測不能となったり、実行されないソース行が発生したりする場合があります。

・if文の分岐に対してコンパイラが分岐構造を生成しない(分岐命令を使用しないコードを生成する)
・コンパイラの最適化により、本来のCソースと異なる構造のコードが生成される
・if ... else 文で、else処理が無く、if文のFALSEケースでの分岐先にアセンブラコードが生成されていない

詳細につきましては、カバレッジマスターwinAMSに添付の「winAMSヘルプ」に「制限事項」として記載されています。下記の手順で参照可能です。

・「Windowsスタートメニュー」→「すべてのプログラム」→「winAMS」→「winAMSヘルプ」を開く
・「検索」タブで「制限事項」を検索する
・検索結果から、タイトル「制限事項」のページを開く

ページ中の「C1カバレッジの制限」に詳細が記載されています。

 

<C1カバレッジが計測できない例: 分岐先にコードが生成されない場合>

例えば以下の様なカバレッジ結果の例の場合、1008行目のif文にTRUE/FALSEの両条件を与えた場合でも、C1カバレッジがOKにならない場合があります。

この様な例は、コンパイラが生成するコードの構造に依存して発生します。この例では、if文のTRUEのパスを検出するためには、1009行目のbreak文が実行されなければなりませんが、コンパイラが生成したコードは、if文がTRUEの場合に、1012行目の最終行に抜けるコードを生成しています。

カバレッジビューで、色が付かないCソース行は、コンパイラにより、その行にコードが生成されていないことを示しています。この例では、break文には色が付いておらず、コードが生成されていません。このため、if文のTRUEのネストにあるbreak文が実行されないため、TRUEが実行されたことをを検出できない結果となります。

<C1カバレッジが計測できない例: 条件付きスキップ命令によって分岐動作が行われている場合>

if文などの分岐処理を含むコードをコンパイルした際に、コンパイラが「スキップ命令」を使用して分岐を処理するコードを作成する場合があります。

例えば、RL78では、if文の処理を条件フラグによって、その直後の命令を実行するか、実行をスキップするかを制御する命令を使うことがあります。下記の例では、if文が条件付きスキップ命令「skz」で制御されています。(RL78には、この命令の他に、SKC、SKNC、SKNZ、SKH、SKNHがあります。)

【スキップ命令の例】

if (condition) 
{
    func();
}
  :
  :

↓RL78コンパイラでコンパイル後
mov ax,condition cmp 0 ax skz                 ; 直前の比較命令(cmp)が0なら直後の「call func」をスキップする call func : :

このアセンブラコードには、分岐構造が作成されていません。そのため、カバレッジマスターで実行した際に、条件(変数condition)はTRUE/FALSEどちらの場合も同じアセンブラコードのルートを通ることになります。その結果、カバレッジマスターは、分岐動作を検出できず、C1カバレッジを計測することができません。

 

<回避方法:埋め込みコードによるカバレッジ測定>

この問題を回避する方法として、「埋め込みコード」によるC0、C1カバレッジ計測の機能があります。これは、「埋め込みコード」と呼ばれるカバレッジ測定のためのコードをテスト対象のソースコードに挿入し、アセンブラコード展開の影響を受けないカバレッジ測定専用のオブジェクトコードを使用してC0、C1カバレッジを計測する方法です。(MC/DCカバレッジを計測する機能と同様です。)

詳細につきましては、以下のFAQを参照してください。

■013_04 : 「埋め込みコード」によるカバレッジ計測を行うために必要なセットアップ、環境の作成について教えて下さい。

 

関連サポート情報検索

【サポート情報サイト内Google検索】

検索キーワード:  C1カバレッジ | 100%にならない

他のキーワード検索


参考情報・リンク