CasePlayer2 解析に関する問題

CasePlayer2 解析に関する問題
D01-01: 詳細解析モードを使用する場合、または、CasePlayer2 でカバレッジマスターとの連携を
行う場合に必要な基本的な設定について教えてください。

【質問】
CasePlayer2 を使って、カバレッジマスターとの連携に必要な「詳細解析」を行おうとしています。最
初に行わなければならない設定について教えて下さい。

【回答】
カバレッジマスターと CasePlayer2 を連携して、C1 カバレッジ、MC/DC 計測や、単体テストでの入
力/出力変数の自動抽出、カバレッジ計測のテストデータ生成機能を使用するためには、
CasePlayer2 で対象ソースコードを正しく解析する必要があります。
※カバレッジマスターゼネラルで、実行コード(*.xlo)を出力する場合も必要です。
CasePlayer2 の解析は、ソースコードの言語仕様に合わせて、CasePlayer2 内蔵の ANSI-C、C99、
GNU-C、VC++、C++の解析エンジンで言語解析するものです。これは、各言語仕様のコンパイラで
コンパイルするのと同じような処理に当たります。
CasePlayer2 の解析結果を使用するためには、解析処理において、ワーニング(警告)以外の全て
のエラーを除去する必要があります。
作業としては、CasePlayer2 の「プロジェクト」メニューから「全仕様書生成」を行うことで、解析が開
始しますが、解析できないエラーがある場合には、画面下の「出力」に表示されます。これをすべて
除去する必要ああります。
CasePlayer2 で正しく 詳細解析を行うためには、以下の設定を行う必要があります。
1)CasePlayer2 の「仕様書生成」の設定で、詳細解析モードを ON にする
CasePlayer2 の「設定」タブの「仕様書生成」の設定画面で、以下のオプションを ON にします。
・□詳細解析を行う
・□winAMS 用プログラム解析情報を生成する(カバレッジマスターとの連携の場合)
カバレッジマスターとの連携に必要なオプションは、上記 2 つのみです。
(クリックで拡大)
また、生成したい仕様書の種類に応じて、「オプション生成」「モジュール仕様書の情報追加」にオ
プションを追加してください。
2)言語仕様の選択
CasePlayer2 プロジェクトの作成時に、テスト対象のソースコードの言語仕様に合わせて、ANSI-C、
C99、GNU-C、VC++のモードを選択します。C++言語の場合には、このオプションを指定します。
ANSI-C 以外の言語モードの使用には、CasePlayer2 の「拡張言語解析オプション」の追加購入が
必要です。このオプションが含まれていない時には、言語選択画面で、このオプションがグレーアウト
され選択できません。
プロジェクト新規作成時の画面、またはプロジェクト作成後「プロジェクト」メニューの「プロパティ」に
て変更できます。
3)プリプロセッサの設定
「設定」タブの「プリプロセッサ」の設定で行います。通常の開発環境で設定しているものと同様に、
CasePlayer2 の解析においても、ヘッダファイルの検索順を指定する「システムインクルードパス」、
「ユーザーインクルードパス」の指定が必要です。クロスコンパイラに指定している情報と同じ検索順
を指定して下さい。また、#ifdef などの切り替えをコンパイルスイッチ(開発環境のプリプロセッサ設
定)で指定している場合には、これと同じ内容を「#define」の設定に加えて下さい。
(参考)インクルードパスの設定が適切でない場合は、以下の様なエラーが出力されます。
CasePlayer2: No such file or directory
CasePlayer2-E-CPP : ファイルの I/O エラーが発生しました.(ヘッダファイルのパス)
(クリックして拡大)
4)C オプションパラメータの設定
「設定」タブの「C オプションパラメータ」の設定で行います。
(クリックして拡大)
この設定は、開発に使用しているクロスコンパイラ独自の方言に対応するためのものです。
CasePlayer2 の解析エンジンは、指定した言語仕様に対応していますが、クロスコンパイラ独自の
言語仕様(方言)には対応できません。このため、ソースコードに記述された方言を、解析時にどの
ように扱うかを設定します。
この設定は、ユーザーがマニュアルで行う事もできますが、プロジェクト新規作成時の画面で、「ター
ゲット CPU 及びコンパイラ固有の設定」により、使用するマイコンとコンパイラを選択しておけば、「C
オプションパラメータ」は自動設定されます。各コンパイラの標準的な記述であれば、自動設定され
るパラメータで、方言を含むソースは正しく解析できます。ただし、コンパイラのバージョンアップや仕
様拡張などで、新たな記述やキーワードが追加された場合は、ユーザーが「C オプションパラメータ」
に設定を加えることで、対応が可能です。
(※「ターゲット CPU 及びコンパイラ固有の設定」は、プロジェクト新規作成時の画面でのみ選択
可能です。プロジェクト作成後に選択を行う事はできません。この場合は、再度プロジェクトを作成
頂く必要があります。)
設定の代表的な例は、以下の通りです。
■ユーザーキーワード
記述例1:int near p1;←near がエラーとなる
near は「型修飾子」です。これを型修飾子として認識させるために、near のキーワードに「TYPEATT」
指定します。
キーワード:near、種類:TYPEATT、後述記述:[空白]
記述例2:direct int array[100];←direct がエラーとなる
direct は「記憶クラス」です。これを記憶クラスとして認識させるために、direct のキーワードに
「STRAGE」指定します。
キーワード:direct、種類:STRAGE、後述記述:[空白]
記述例3:__asm (“ ....... “)←__asm がエラーとなる
__asm は「インラインアセンブラ記述」です。これをインラインアセンブラ記述として認識させるために、
__asm のキーワードに「ASM」指定します。また、このキーワードに続く記述が__asm の内容の記述
であることを示すために、後置記述に「(EXPRESSION)」を指定します。
キーワード:__asm、種類:ASM、後述記述:(EXPRESSION)
記述例4:__except←__except がエラーとなる
__except は例外処理を示すコンパイラ浦独自の記述文法です。この記述全体を無視させるため
に、__except のキーワードに「IGNORE」指定します。また、このキーワードに続く記述が__except の
内容の記述であり、同時に無視させるために、後置記述に「(EXPRESSION)」を指定します。
キーワード:__except、種類:IGNORE、後述記述:(EXPRESSION)
■置き換えキーワード
記述例1:typedef __WCHAR_T_TYPE__ _Wchart;←__WCHAR_T_TYPE__がエラーとなる
このエラーを回避するために、__WCHAR_T_TYPE__を int 型に置換して解析させます。このために、
置き換えキーワードの機能を使います。
新キーワード:int, 既にあるキーワード __WCHAR_T_TYPE__
記述例2: typedef __SIZE_T_TYPE__ _Sizet;←__SIZE_T_TYPE__がエラーとなる
このエラーを回避するために、__SIZE_T_TYPE__を int 型に置換して解析させます。このために、置
き換えキーワードの機能を使います。
新キーワード:int, 既にあるキーワード __SIZE_T_TYPE__
上記の2つのオプションでほとんどのケースに対応できます。その他の設定につきましては、ヘルプマ
ニュアルをご参照下さい。

【補足資料】
CasePlayer2 セットアップ手順書(PDF ファイル)

【補足情報】
ルネサス製(旧 NEC 系)のクロスコンパイラで、デバイスファイルを使用して i/o ポートを定義してい
る場合は、i/o ポート名を解析するために、この情報をヘッダファイルとして解析に加える必要があり
ます。詳細は下記の FAQ をご覧ください。
019_06 : ルネサスエレクトロニクス(旧 NEC エレクトロニクス)の純正クロスコンパイラを使用していま
すが、CasePlayer2 での解析時に「CasePlayer2-E-SYN : 名前( *** )が宣言されていません.」のエ
ラーが出ます。
019_04 : CasePlayer2 の解析中にヘッダファイルの「ファイル i/o エラー」が発生します。どのように対
処すればよいですか?

【質問】
カバレッジマスターWinAMS から CasePlayer2 を起動し、仕様書を作成しようとしたところ、以下の
エラーメッセージが表示されます。どのように対処すればよいですか?
仕様書生成中...
C ソースの詳細解析中...
[ソースファイルパス*******.c](行番号)
CasePlayer2-E-CPP : ファイルの I/O エラーが発生しました.(**********.h)
[ソースファイルパス*******.c](行番号)
CasePlayer2: No such file or directory
CasePlayer2-E-CPP : ファイルの I/O エラーが発生しました.(**********.h)
[ソースファイルパス*******.c](行番号)
CasePlayer2: No such file or directory
:
:

【回答】
この場合は、「設定」タブの「プリプロセッサ」の設定にて、ヘッダファイルの検索パスを指定するために、
インクルードパスの設定を行って下さい。このインクルードパスは、開発環境や MAKEFILE で指定
している情報を設定する必要があります。開発環境の設定ファイルや MAKEFILE からこれらのパス
情報を読み込む機能はありません。「プリプロセッサ」の設定画面で、ユーザー自身で設定を行う
必要があります。
なお、システムインクルードパスとユーザーインクルードパスのヘッダファイル検索順序は次のようにな
りますので参考にしてください。
「#include <文字列>」という形式の場合、
①システムインクルードパスに指定されたフォルダを検索
②該当ソースファイルがあるフォルダ(カレントフォルダ)を検索
「#include "文字列"」という形式の場合、
①ユーザインクルードパスに指定されたフォルダを検索
②該当ソースファイルがあるフォルダ(カレントフォルダ)を検索

(参考)
また、これに関連する事項としては、#ifdef などの記述でソースコードの切換を行っている場合は、
開発環境でコンパイルスイッチを使って指定している#define の情報を、CasePlayer2 にも設定す
る必要があります。「設定」タブの「プリプロセッサ」の設定にて、「#define」の欄に追加して下さい。
019_07 : CasePlayer2 にソースを登録して解析しましたが、「CasePlayer2-E-SYN : ; が必要です」
のエラーが発生します。

【質問】
CasePlayer2 に C ソースを登録してプロジェクトメニューの「全仕様書生成」を実行してみましたが、
「CasePlayer2-E-SYN : ; が必要です」のエラーが発生して、解析が進みません。どのように対処
すれば良いですか?

【回答】
「CasePlayer2-E-SYN : ; が必要です. 」のメッセージは、ソースコードにクロスコンパイラコンパイ
ラ特有の記述など、ANSI-C に準拠しない記述が含まれており、その構文を CasePlayer2 が解析
できない場合に表示されます。
下の例では、etos.c の 2 行目に該当する記述が含まれていることを示しています。
CasePlayer2-E-SYN : ; が必要です.
C:\Program Files\GAIO\CasePlayer2\sample\C_program\etos.c(2)
例えば、以下の様な記述がある場合に、このエラーが発生します。
direct int var1;
この例では、「direct」はコンパイラ特有の記述であり、一般的な C 言語(ANSI-C)では使われませ
ん。このワードが正しく解釈されず、この影響でエラーが発生します。
CasePlayer2 には、このようなコンパイラ特有の記述の意味を指定する機能があります。「direct」は
記憶クラスを指定するキーワードであるため、これを CasePlayer2 に設定して正しく解釈させるよう
にします。
「設定」タブにある「C オプションパラメータ」を開いて下さい。「ユーザーキーワード」の指定にて、
キーワード: direct 種類: STRAGE 後置記述:空欄
に設定することで、direct を記憶クラスのワードとして正しく解釈するようになります。
【解析エラーとなる記述とユーザーキーワードの例】
INT32 value;
キーワード: INT32 種類: TYPE 後置記述:空欄
※INT32 を「型の定義」として解釈させる
near int value;
キーワード: near 種類: TYPEATT 後置記述:空欄
※near を「型修飾子の定義」として解釈させる。
キーワードに続いて()にパラメータを持つような記述の場合は、「後置記述」の項目に
「(EXPRESSION)」を指定します。
__asm("LAB2:");
キーワード: __asm 種類: ASM 後置記述:(EXPRESSION)
※インラインアセンブラ記述の定義として解釈させる
応用として、以下の様な記述では、
#define _ARMABI __declispec(__nothrow) __pure
_ARMABI volatile int *func(void);
キーワード: __declispec 種類: IGNORE 後置記述:(EXPRESSION)
※キーワード「__declispec」及び後置記述「__nothrow」を無視
キーワード: __pure 種類: IGNORE 後置記述:空欄
※キーワード「__pure」を無視
ルネサスエレクトロニクス(旧 NEC エレクトロニクス)の純正クロスコンパイラを使用していますが、
CasePlayer2 での解析時に「CasePlayer2-E-SYN : 名前( *** )が宣言されていません.」のエ
ラーが出ます。

【質問】
ルネサスエレクトロニクス(旧 NEC エレクトロニクス)の純正クロスコンパイラを使用していますが、
CasePlayer2 での解析時に「CasePlayer2-E-SYN : 名前( *** )が宣言されていません.」のエラ
ーが出ます。この宣言は、i/o ポートの名称のようです。どのように対処すれば良いですか?

【回答】
旧 NEC 系のマイコン、V850 シリーズや 78K0 シリーズ向けの純正開発環境、PM+や CubeSuite
等で純正コンパイラを使用している場合、そのソースコードを CasePlayer2 で解析すると下のような
未定義エラーが多数発生します。
CasePlayer2-E-SYN :
CasePlayer2-E-SYN :
CasePlayer2-E-SYN :
CasePlayer2-E-SYN :
:
:
名前( TOE0 )が宣言されていません.
名前( TS0 )が宣言されていません.
名前( TT0 )が宣言されていません.
名前( TOE0 )が宣言されていません.
これは、純正コンパイラでは、マイコンの i/o ポートやレジスタの定義を、ヘッダファイルではなく旧 NEC
独自の「デバイスファイル」でコンパイラに与える仕組みとなっているためです。これらのコンパイラが暗
黙の定義として持つレジスタ名を CasePlayer が解析した際に、この名称がソースコードやヘッダファ
イルに定義されていないため、エラーとなります。
これを回避するためには、CasePlayer2 での解析の際に、デバイスファイルで定義されている内容を
ヘッダファイルを作成して与える必要があります。
ガイオでは、ユーザーが使用している「デバイスファイル」から、その内容を定義したヘッダファイルを作
成するサポートを行っています。ユーザーサポート宛に、「デバイスファイル」を添えてお問い合わせ頂
ければ、作成したヘッダファイルを返送させて頂きます。
このヘッダファイルを入手後、CasePlayer2 の「設定」タブの「プリプロセッサ」の設定にて、「プレインク
ルード」に指定して下さい。ソースコードに#include 記述を追加する必要はありません。プレインクル
ードに設定したヘッダファイルは、全てのソースの解析時に最初に読み込まれ、解析に使用されま
す。

【補足情報】
「デバイスファイル」で定義されている i/o ポートのシンボルを、カバレッジマスターの入力/出力変数
に指定する場合には、「定義名リスト」の機能を使用して、これらの i/o ポート名を再登録して使
用する必要があります。詳細は、以下の FAQ をご覧ください。
005_01 : ルネサスエレクトロニクス(旧 NEC エレクトロニクス)のコンパイラを使用していますが、i/o ポ
ートが入出力変数に指定できません
019_02 : CasePlayer2 インクルードパスの検索順序はどのようなりますか?

【質問】
#include に よ る ヘ ッ ダ フ ァ イ ル の 検 索 の 順 番 は 処 理 系 依 存 に な っ て い る と 思 い ま す が 、
CasePlayer2 の場合、「#include <文字列>」と「#include "文字列"」の記述によるヘッダファイル
の検索はどのように扱われますか?

【回答】
CasePlayer2 では、それぞれ、下記①②の順番で検索します。
「#include <文字列>」という形式の場合、
①システムインクルードパスに指定されたフォルダを検索
②該当ソースファイルがあるフォルダ(カレントフォルダ)を検索
「#include "文字列"」という形式の場合、
①ユーザインクルードパスに指定されたフォルダを検索
②該当ソースファイルがあるフォルダ(カレントフォルダ)を検索
019_03 : CasePlayer2 のインクルードパス設定に相対パスを使用することはできますか?

【質問】
CasePlayer2 の「プリプロセッサ(C 言語)の設定」→「ユーザーインクルードパス」の設定で、選択し
たフォルダには絶対パスが登録されますが、これを相対パスで登録することはできますか?

【回答】
フォルダを選択してインクルードパスを指定した場合、画面には絶対パスで表示されますが、ツール
内部ではプロジェクトファイル(.vproj)からの相対パスで管理しています。CasePlayer2 のプロジェクト
の保存場所を変更した場合でも、ユーザーインクルードパスを再度登録する必要はなく、自動的
に移動先のディレクトリに追従する仕様となっています。
設定画面にて相対パス表示で、直接入力して登録することはできません。
ただし、プロジェクト新規作成時に「ソースファイルは絶対パスで管理する」のオプションを選択してい
る場合は、内部的に絶対パス管理を行いますので、この限りではありません。
019_05 : CasePlayer2 インクルードパスを指定しましたが、サブフォルダのヘッダファイルが認識されま
せん。

【質問】
CasePlayer2 のプロプロセッサ設定で、ユーザーインクルードパスを指定しました。インクルードファイ
ルの親フォルダを指定したのですが、その下にあるサブフォルダ内のヘッダファイルが認識されません。
どのように対処すればよいですか?

【回答】
インクルードパスは、その配下のサブフォルダは含まれません。インクルードフォルダが複数に分かれて
いる時は、インクルードのフォルダを全て個別に指定する必要があります。フォルダが階層構造にな
っている時も同様に、個々にフォルダを登録する必要があります。
462_01 : カバレッジマスター(SSTManager)と CasePlayer2 のはバージョンを合わせる必要がありま
すか?

【質問】
カバレッジマスターと CasePlayer2 を連携して使用していますが、カバレッジマスターのアプリケーショ
ン SSTManager と CasePlayer2 のバージョンは、合わせる必要があるのですか?

【回答】
正しく動作させるためには、両者のバージョンの整合を取る必要があります。正しい組み合わせは
以下の通りです。
カバレッジマスターWinAMS(SSTManager)は、 V3.nn.mm
CasePlayer2 は、 V5.nn,mm
※ nn と、mm のリビジョン番号を合わせる必要があります。
例)カバレッジマスターWinAMS:3.1.1
CasePlayer2:5.1.1
462_02 : CasePlayer2 のアセンブラからフローチャートなどの仕様書を生成する機能は、どのマイコ
ンにしていますか?

【質問】
CasePlayer2 はアセンブラからフローチャートなどの仕様書を作成できますが、どのマイコンに対応し
ているのでしょうか?

【回答】
CasePlayer2 のアセンブリ解析は、rev ファイルと言うアセンブラ命令定義ファイルに、アセンブリ命
令(ニューモニック)とその属性を指定すれば、どのアセンブリにも対応できるようになっています。
rev ファイルはユーザーに作成頂く物で、弊社からは特定のマイコン(アセンブラ)に対応した rev ファ
イルの提供は行っておりません。
下記のディレクトリに、各マイコンの rev ファイルサンプルがインストールされています。
C:\Program Files\GAIO\CasePlayer2\sample
このファイルを参考に、ユーザー様に rev ファイルを作成頂いています。
68000
H8300
M32R
mn1933
Tlcs870X
68hc11
H8300h
Macro740
mn19500
Tlcs90
V850
68hc16
H8500
Macro78k
Olms66k
Tlcs900
V850E
ARM
H8s
Asm38
Hi_Perion1 MCS51
R6502
TMS320C25
Fmc16
i80386
Mcs96
Sh
Tx19
Fmc16f
i8086
Melps77
Fmc8
Linux
Mn101
Fmc8l
M16
fmc8l_str
M16c
MacroAs30
Mn102
Mn103
Olms66ks
Spc700
Spc900
Tlcs870
Tlcs870C
Tmp7600
V20
Z80
Tx19A
Upd78k0
Upd78k3
Upd78k4
このサンプル rev ファイルのアセンブラの仕様は、弊社製 XASS-V シリーズのアセンブラニューモニック
を使用したものであるため、他の半導体メーカーやサードパーティー製のアセンブラの場合には、ニュ
ーモニックの記述が異なる場合があり、この場合は rev ファイルを変更する必要があります。アセン
ブラ独自仕様のマクロ定義や疑似命令などが記述されている場合は、解析に対応できないケー
スもあります。これは制限事項になっています。
マイコンによっては、「遅延スロット」など、マイコンアーキテクチャに依存した動作が有り、このパラメ
ータを rev ファイルに指定する必要があります。新規に rev ファイルを作成するには、マイコンの命令
仕様を理解している必要があります。

<参考>
■rev ファイルサンプル
・ガイオ製アセンブラ(XASS-V 仕様)Z80 アセンブラ向け rev ファイル(Z80.rev.txt)
・ガイオ製アセンブラ(XASS-V 仕様)8086 アセンブラ向け rev ファイル(i8086.rev.txt)
MISRA-C 解析に関する問題
M01-01: MISRA 解析を行っていますが、シフト演算処理の前にシフト値のチェックを行っているに
も係わらず、違反(チェックをしていない)が報告されます。なぜですか?

【質問】
MISRA 解析を行っていますが、シフト演算処理の前にシフト値のチェックを行っているにも係わらず、
違反(チェックをしていない)が報告されます。なぜですか?

【回答】
これは、シフト値を指定する変数が構造体メンバーの場合などに発生します。
(例)if ( pStrPtr->shiftBit >= 0 && pStrPtr->shiftBit < 32 ) // シフト値チェック
{
data >> pStrPtr->shiftBit; // シフト操作
}
上の例の場合、ポインタ参照にてシフト前の確認が行われていますが、CasePlayer2 はエラーの可
能性があるものとして扱い、MISRA-C 2004 ではルール番号[12.8]、MISRA-C 1998 ではルール番
号[38]の違反を出力します。これは CasePlayer2 の解析エンジンの機能制限の1つです。
この様な違反に対して、MISRA-C 解析機能には、エラーとして出力するかどうかの解析判断に設
定があります。
CasePlayer2 の設定タブの、「MISRA-C 解析」の中にある
「プログラム動作上問題になる可能性があるものを指摘する」
を ON にしていた場合、プログラム動作上問題になる可能性がある記述と解析にて判断が行われ
た場合には、エラーを出力します。このオプションは、現在の MISRA-C 解析エンジンにより、明確に
エラーと判断できないものの場合に、エラーとして扱うか否かを設定するものです。本件のエラーは、
上記の設定オプションを OFF にして頂くと、エラーを表示しません
ただし、可能性としましては、問題を起こす可能性がある場合でもエラーを出さない結果となるた
め、デフォルトではこのオプションが ON になっています。
運用方法としましては、上記の通り OFF で運用頂きエラーを排除するか、ON のままで運用頂き、
出力されたエラーにつきましては、ユーザーにご判断頂く方法となります。
なお、マニュアルからの抜粋ですが、このオプションの説明を下に添付いたします。
--(CasePlayer2 ヘルプマニュアルより)-プログラム動作上問題になる可能性があるものを指摘する
下記のルールに関して、プログラム動作上問題になる可能性がある記述についてメッセージを出す
かどうかを指定できます。一つのルールでプログラム動作上問題になる可能性がある記述と明確に
問題がある(または明確に違反がある)記述があるルールのみ、この指定で制御できます。
《MISRA-C:1998 でこのオプションが適用されるルール》
ルール 4
ルール 30
ルール 38
ルール 114
《MISRA-C:2004 でこのオプションが適用されるルール》
ルール 9.1
ルール 12.8
ルール 17.1
ルール 17.2
ルール 17.3
ルール 17.4
ルール 20.1
ルール 21.1
CasePlayer2 仕様書出力に関する問題
C01_01 : CasePlayer2 で WORD 書類を作成しようとすると「実行時エラー'5941'指定されたコレク
ションのメンバーは存在しません。」のエラーが出て変換できません。

【質問】
使用中の PC には Word2000 がインストールされていますが、CasePlayer2 で仕様書を WORD フ
ォーマット(*.doc)として出力したいのですが、変換後数秒で「実行時エラー'5941'指定されたコレ
クションのメンバーは存在しません。」のエラーが出力され変換できません。どの様にすれば良いです
か?

【回答】
こ の 問 題 は、 Word2000 のバ ー ジョン が古 い 場 合 に発 生 し ます 。 Microsoft の サイ トより、
「Word2000 サービスパック」をインストールすることで、問題を解決することができます。2011/04 の
時点では、サービスパック「SP3」がリリースされています。検索サイトにて、「Office 2000 アップデー
ト」のキーワードで検索を行って下さい。
C01_02 : CasePlayer2 で仕様書の WORD 変換中に「<Template List> ******.dot」のエラーで変
換が止まってしまいます。

【質問】
CasePlayer2 で仕様書を WORD フォーマット(*.doc)として出力したいのですが、変換後数秒で
「<Template List> ******.dot」のエラーが出力され変換できません。どの様にすれば良いです
か?

【回答】
この問題は、Word の「セキュリティ」設定を行うことで解決できます。Word を起動し、以下の手順
で設定を行ってください。
【Word2000 の場合】
メニューの「ツール(T)→マクロ(M)→セキュリティ(S)...」を選択すると「セキュリティ」ダイアログが表示さ
れます. 「信頼のおけるソース元(T)」タブをクリックし、「すべての組み込み済みのアドインとテンプレ
ートを信頼する」チェックボックスを ON にします
【Word2002、Word2003 の場合】
メニューの「ツール(T)→マクロ(M)→セキュリティ(S)...」を選択すると「セキュリティ」ダイアログが表示さ
れます. 「信頼のおける発行元」タブをクリックし、「組み込み済みのアドインとテンプレートをすべて
信頼する」チェックボックスを ON にします.さらに、「Visual Basic プロジェクトへのアクセスを信頼す
る」チェックボックスも ON にして下さい。
【Word2007 の場合】
Office ボタンをクリックし、「Word のオプション(I)」を選択すると、「Word のオプション」ダイアログが表
示されます.このダイアログの「セキュリティセンター」タブをクリックし、「セキュリティセンターの設定
(T)...」ボタンをクリックすると、「セキュリティセンター」ダイアログが表示されます.ここで、[マクロの設
定]タブをクリックし、「Visual Basic プロジェクトへのアクセスを信頼する」チェックボックスを ON にして
下さい。
【Word2010 の場合】
[ファイル]タブから[オプション]をクリックして、Word のオプション ダイアログボックスを表示します。左
側の一覧から[セキュリティセンター]を選択し、[セキュリティセンターの設定(T)...]ボタンをクリックしま
す。表示されるセキュリティセンターダイアログで、左側の一覧の[マクロの設定]をクリックし、「VBA プ
ロジェクトオブジェクトモデルへのアクセスを信頼する(V)」チェックボックスを ON にしてください。
また、このエラーには関係ありませんが、Word で正しく仕様書を出力するために、以下の設定を確
認してください。
【Word2000 の場合】
・メニューの「挿入(I)→図表番号(C) ...」を選択すると、「図表番号」ダイアログが表示されます。
このダイアログの[自動設定(A) ...]ボタンをクリックし、「図表番号を付ける対象(A)」リストで
"Microsoft Word の表"のチェックを外して[OK]ボタンをクリックします。
【Word2002 の場合】
・メニューの「ツール(T)→オプション(O)…」を選択すると、「オプション」ダイアログが表示されます。
「表示」タブをクリックし、「ページ間の余白(印刷レイアウト表示)」チェックボックスを ON にしてくださ
い。
・メニューの「挿入(I)→参照(N)→図表番号(C)...」を選択すると、「図表番号」ダイアログが表
示されます。このダイアログの [自動設定(A)...]ボタンをクリックし、「図表番号を付ける対象(A)」
リストで"Microsoft Word の表"のチェックを外して [OK] ボタンをクリックします。
【Word2003 の場合】
・メニューの「挿入(I)→参照(N)→図表番号(C)...」を選択すると、「図表番号」ダイアログが表
示されます。このダイアログの [自動設定(A)...]ボタンをクリックし、「図表番号を付ける対象(A)」
リストで"Microsoft Word の表"のチェックを外して [OK] ボタンをクリックします。
【Word2007 の場合】
・Office ボタンをクリックし、「Word のオプション(I)」を選択すると、「Word のオプション」ダイアログが
表示されます。このダイアログの「表示」タブをクリックし、「印刷レイアウト表示でページ間の余白を
表示する(W)」チェックボックスを ON にしてください。
・Office ボタンをクリックし、「Word のオプション(I)」を選択すると、「Word のオプション」ダイアログが
表示されます。このダイアログの「保存」タブをクリックし、「標準のファイル保存形式(F)」を「Word
文書(*.docx)」に設定してください。
・「参考資料」タブをクリックして、[図表番号の挿入] ボタンをクリックします。「図表番号」ダイアロ
グが表示されるので、このダイアログの [自動設定...] ボタンをクリックし 「図表番号を付ける対
象(A)」 リストで”Microsoft Word の表”のチェックを外して、[OK] ボタンをクリックします。
【Word2010 の場合】
・[ファイル]タブをクリックして,[オプション]をクリックします。Word のオプション ダイアログボックスが表
示されるので,左側の一覧から[表示]をクリックして、「印刷レイアウト表示でページ間の余白を表
示する」のチェックボックスを ON にしてください。
・[ファイル]タブをクリックして、[保存と送信]をクリックします。[ファイルの種類の変更]をクリックして、
ファイルの保存形式を「文書(*.docx)」に設定してください。
・「参考資料」タブをクリックして、[図表番号の挿入] ボタンをクリックします。「図表番号」ダイアロ
グが表示されるので、このダイアログの [自動設定...] ボタンをクリックし 「図表番号を付ける対
象(A)」 リストで”Microsoft Word の表”のチェックを外して、 [OK] ボタンをクリックします。
オブジェクトファイル・OMF 変換に関する問題
017_01 : 「OMF 変換」のボタンがグレーアウトし押すことができません。どのようにすれば良いです
か?

【質問】
半導体メーカー純正のコンパイラを使用しています。カバレッジマスターwinAMS にテスト対象のオブ
ジェクトファイルを指定する場合、「OMF 変換」が必要だと思いますが、画面上でこのボタンがグレ
ーアウトしており、押すことができません。どのようにすれば良いですか?

【回答】
「ファイル」メニューから「プロジェクトの基本設定を変更」を選択し、「コンパイル環境」の設定を「そ
の他」にすることで、OMF 変換の機能が使用できるようになります。
017_02 : OMF 変換を行うと、Warning が大量に出力されます。この Warning の出力を行わない
方法はありますか?

【質問】
Q.OMF 変換を行うと、下記のような Warning が大量に出力されます。これはなぜでしょうか?この
Warning の出力を行わない方法はありますか?
・Warning!! [****] パラメータ情報を取得できませんでした。 ( **** )
・Warning!! [****] 変換に必要な情報が不足しているため変換できません。 ( **** )

【回答】
コンパイル時に、コンパイラの最適化によってコード化されなかったオート変数の割付けアドレス(スタ
ックからのオフセットやレジスタ番号)などが、コンパイル後のオブジェクトコードのデバック情報に設定
されない場合があり、これが Warning として出力されます。これらが出力される場合でも、単体テス
トの実行には問題ありません。
一部のマイコンには、Warning を出力しない「-NOWARNING」の OMF 変換オプションがサポート
されています。
017_03 : OMF 変換によりオブジェクトを変換したいのですが、途中で強制終了してしまいます。

【質問】
OMF 変換により半導体メーカー製のコンパイラが出力したオブジェクトを変換しましたが、途中で
強制終了してしまいます。コンパイラメーカーやオブジェクトフォーマットは正しく設定しているのです
が、どうしてこのようなエラーとなるのでしょうか?

【回答】
マイコンや開発環境によっては、オブジェクトフォーマットにバージョンがあり、カバレッジマスターがサポ
ートしないオブジェクトフォーマットのバージョンをご利用の場合、エラーが発生することがあります。
対応可能なオブジェクトフォーマットは、WEB サイトの「他社コンパイラサポート情報」ページの「オブ
ジェクト形式」に掲載されています。
不明の場合には、弊社サポート窓口([email protected])までお問い合わせください。
017_04 : OMF 変換中に「オブジェクトが正しく読めませんでした」のエラーが出力され、変換が行え
ません。

【質問】
ルネサス純正のコンパイラ(SH2E SH C/C++ Compiler Ver. 7.1.03)を使用していますが、OMF 変
換中に「オブジェクトが正しく読めませんでした」のエラーが出力され、変換が行えません。どのように
すれば良いですか?

【回答】
ルネサス純正・HEW 環境の SH C/C++コンパイラ V7.X.X において ELF オブジェクトフォーマットを
ご利用の場合、このオブジェクトには DWARF1 のフォーマットが使用されており、OMF 変換の機能
はサポートされておらず、SYSROF フォーマットのみがサポートされています。HEW 環境でのコンパイ
ル時に、オブジェクトフォーマットに SYSROF を選択頂き、カバレッジマスターの OMF コンバーターに
も SYSROF を指定することで回避ができます。
各コンパイラ(マイコン)毎の、オブジェクトフォーマットのサポート状況は、WEB ページの「他社コンパ
イラサポート情報」の「オブジェクト形式」に掲載されています。
017_05 : カバレッジマスターのプロジェクト作成ダイアログで、使用しているマイコンの型番がリストに
表示されません。

【質問】
カバレッジマスターのプロジェクト作成ダイアログで、マイコンの「型番」を選択しようとしましたが、使
用しているマイコンの型番がリストに表示されません。どの型番を選択すればよいのでしょうか?

【回答】
カバレッジマスターはマイコンのコア部分(命令処理部分)のみを使用し、周辺ペリフェラルは使用し
ません。そのため、基本的には「MPU 名」の項目にて MPU シリーズ名が正しく選択されていれば動
作に問題はありません。だたし、一部のマイコン(H8/S、H8/300H など)で、同じシリーズでも命令
コアが異なる物があり、これに対応するために型番指定の項目があります。
ご利用のマイコンの型番がプロダウンリストに表示されない場合は、同じコアを持つ型番を選択頂
ければ問題ございません。コアの種類などがご不明な場合は、弊社ユーザーサポート窓口
([email protected])までお問い合わせください。
017_06 : ルネサス CubeSuite+を使用して RL78 のコードを生成しましたが、OMF 変換しテスト実
行後、「ソースファイルが存在しません。」のエラーが出ます。

【質問】
ルネサス CubeSuite+を使用して RL78 のコードを生成しましたが、OMF 変換しテスト実行後、「ソ
ースファイルが存在しません。」のエラーが出ます。どうすれば、このエラーを消すことができますか?

【回答】
ルネサス CubeSuite+を使用して RL78 のオブジェクトコード(デバッグ情報付き)を生成した場合、
COFF フォーマットによりオブジェクト(*.lmf)が生成されます。この COFF フォーマットには、ソースファ
イルのパス参照情報がないため、カレントフォルダ以外のソースファイルはそのままでは参照できませ
ん。
これを回避するには、OMF 変換時に「-s」オプションを使用して、ソースファイルのカレントパスを指
定し、再度 OMF 変換を行ってください。これにより、変換されたオブジェクトファイル(*.xlo)にソース
ファイルパス情報が付加され、エラーを回避できます。
(例)C:¥TEST¥src¥main.c のソースファイルパスを指定する場合、OMF 変換の変換オプションに、
-s C:¥TEST¥src
を指定します。
021_01 : VxWorks の「ローダブルモジュール」の場合、どのようにすれば単体テストを実行できます
か?

【質問】
WindRiver 社の VxWorks を使用していますが、アプリケーションを OS の SHELL からロードする「ロ
ーダブルモジュール」の場合、カバレッジマスタ-winAMS ではどのようにすれば単体テストを実行で
きますか?

【回答】
カバレッジマスターはマイコンの命令処理部分のみを使用して関数動作を評価するため、OS シス
テムを動作させたテストを行うことはできず、「ローダブルモジュール」には対応できません。このような
ソフトをカバレッジマスターwinAMS でテストするためには、評価対象の関数が含まれるモジュールを
「ブータブルモジュール」(OS 部分と共に ROM 化されるモジュール)として生成して頂く必要がありま
す。このときのモジュールを割り付けるアドレスは任意で構いません。
115_01 : アセンブラにて定義した変数をテスト条件の変数に指定することはできますか?

【質問】
アセンブラにて定義した変数を C 言語のポインタとして使用しているのですが、CSV 雛形作成の画
面にて変数一覧から該当の変数を指定し、入出力変数に追加すると「アセンブララベル設定」が
表示され、ポインタとして認識されません。アセンブララベルを通常のポインタと同様に使用したいと
きはどのようにすればよいのでしょうか?
アセンブラ変数:.EXPORT _tmp
C 言語ポインタ宣言:extern unsigned char *tmp;
使用例:
switch(*tmp)
{
・・・
}

【回答】
テスト CSV ファイルに登録可能な変数は、変数の実体を宣言している C 言語のシンボルのみで
す。回避策としましては、アセンブラで定義した変数を C 言語で書き換えて頂くか、もしくは、*tmp
のアドレスを定義名リストの機能を使用してシンボル化して使用する方法があります。
<参考:定義名リストについて>
定義名とは、カバレジマスターの中で使用可能な、仮想的な変数名の定義です。モジュールテス
ト用 CSV 雛形作成の画面の「定義名リスト」タブで作成できます。
「I/O 登録」のボタンを押し、「定義名」にポインタやメモリに付けたい名称を設定、「種別」はアドレ
スを選択し、アドレスと型(ビット幅)を指定することで、「定義名」に付けた名称を使って、通常の C
言語変数と同じように CSV ファイルの変数指定に使用できます。
下の例の場合、上記のソースのポインタ *tmp(アドレスが 0x00800064 の場合) の実体を示す
定義名(仮の変数)TMP を作成しています。C 言語のイメージで言い換えれば、アドレスが
0x00800064 にマッピングされた「unsigned char TMP」の変数を作成したのと同じ事になります。
CSV ファイルにこの定義名を登録するだけで、*tmp の指す実体にテストデータを入力できます。
115_02 : #pragma inline_asm を使用した関数をテスト対象にする方法は?

【質問】
ルネサス純正の HEW 環境において、#pragma inline_asm を使用して関数を定義すると、その関
数のシンボル情報が生成されません。どのようにすればカバレッジマスターにて関数として認識させ
ることができますか?

【回答】
#pragma inline_asm を使用した場合、コンパイラが出力するデバック情報はアセンブラ形式で出力
されるため、カバレッジマスターで関数として扱うことはできません。この問題はコンパイラの仕様に依
存しており、これを回避するには、#pragma inline_asm の記述とアセンブラ記述部分を#ifdef 等に
よりコメントアウトし、インラインアセンブラの指定を外してコンパイルして頂くしかございません。
115_03 : アセンブラで定義した変数のリファレンスリストを作成できません。

【質問】
アセンブラと C 言語の併用でプログラムしております。CasePlayer2 を使用して変数のリファレンスを
生成しているのですが、C 言語で定義した変数のみが出力され、アセンブラで定義されている変数
が出力されません。アセンブラで定義された変数はどのようにすれば出力できますか?

【回答】
アセンブラで定義された変数には、コンパイル後のオブジェクト中に C 言語としてのデバッグ情報が
入っていません。アセンブラで定義された変数を C 言語の様に変数として認識する事が出来ない
ため、変数のリファレンスに出力することはできません。
316_01 : 割り込みハンドラを単体テスト対象にしたいのですが、どのようにすれば良いですか?

【質問】
割り込みハンドラの関数をテスト対象として指定しましたが、カバレッジマスターのシミュレーションが
終了せず、結果が出力されません。どのようにすれば良いですか?

【回答】
カバレッジマスターwinAMS では、検証対象とする関数にはリターン命令が含まれている事が必要
です。割り込みハンドラにはこれが含まれず、引数の渡し方も通常の関数と異なるため、検証対
象とすることはできません。テストを行うためには、割り込み関数宣言を外して再コンパイルを行い、
一般関数同じオブジェクト構造にする必要があります。
例えば、割り込みハンドラが
__interrupt void irq_handler()
で定義されている場合、
#define __interrupt
をヘッダファイル等に追加することで、__interrupt 部分を無効化することができます。
453_01 : スタティック関数がカバレッジマスターの関数リストに表示されません。

【質問】
CasePlayer2 で詳細解析が完了したファイル内に static 関数がある場合、CSV 雛形作成の設
定画面で、static がついていないグローバル関数は問題なく見つかりますが、static 関数が見つか
りません。どのようにしたら、テスト対象関数にできるでしょうか?

【回答】
スタティック関数の表示形式は、[ソースファイル名]/[関数名]となります。(例:main.c/func1)この
形式で、関数名の指定を行ってください。モジュールテスト用雛形作成画面の関数参照ボタンで
表示される関数選択画面には、この形式で表示されます。
102_08 : インライン展開された関数やマクロ定義された関数をテストしたいのですが、どのようにす
るのが良いでしょうか?

【質問】
#pragma や inline キーワードによってインライン展開される関数や、マクロ定義された関数を単体テ
ストしたいのですが、どのようにすれば良いですか?

【回答】
カバレッジマスターでテスト対象関数とするためには、デバッグ情報シンボルを持つ関数オブジェクト
としてコードが生成されている必要があります。直接関数名を指定してテストを行う(スタブを作成
する場合も同様)ためには、インライン展開の指定やマクロ定義の形式を外して、通常の関数とし
てオブジェクト化する必要があります。ただし、この場合は、実際のオブジェクト構造とは異なったコ
ードになってしまいます。
<テストの考え方について>
インライン関数やマクロ定義された関数は、テスト対象の関数にコードが埋め込まれて1つの関数
オブジェクトになっています。そのため、インライン関数やマクロ定義された関数を別の関数とはしな
いで、このままの状態でテストを行えば、実際のコードに最も忠実なテストになります。
ただし、カバレッジマスターでカバレッジ測定を行う場合、マクロ定義された関数部分は、テスト対
象の関数の中では1つの処理(1 行の実行文)として扱われ、内部のカバレッジを測定することはで
きません。また、インライン関数は、テスト対象の関数から駆動された場合はそのカバレッジが同時
に測定されますが、インライン関数を直接駆動して単体テストやカバレッジ測定を行う事はできませ
ん。
そのため、上記の様にテスト対象関数に埋め込まれた状態でテストを行った上で、追加テストとし
て、インライン展開の指定やマクロ定義の形式を外して関数オブジェクト化し、インライン関数やマ
クロ定義された関数のみのカバレッジ計測を行う方法を推奨致します。
102_09 : インライン展開された関数やマクロ定義された関数のスタブ関数が作成できません。どの
ようにすれば作成できますか?

【質問】
#pragma や inline キーワードによってインライン展開される関数や、マクロ定義された関数のスタブ
関数を作成しようとしていますが、これらの関数名が、スタブ作成の関数リストに表示されません。
どのようにすれば、スタブを作成できますか?

【回答】
カバレッジマスターでスタブ関数を作成するためには、対象の関数がデバッグ情報シンボルを持つ関
数オブジェクトとしてコード化されている必要があります。スタブを作成するためには、インライン展開
の指定やマクロ定義の形式を外して再コンパイルし、通常の関数として扱えるようにする必要があ
ります。ただし、この場合は、元のオブジェクト構造と異なったコードになってしまいます。
<テストの考え方について>
インライン関数やマクロ定義された関数は、テスト対象の関数にコードが埋め込まれて1つの関数
オブジェクトになっています。そのため、インライン関数やマクロ定義された関数を別の関数とはしな
いで、このままの状態でテストを行えば、実際のコードに最も忠実なテストになります。
ただし、カバレッジマスターでカバレッジ測定を行う場合、マクロ定義された関数部分は、テスト対
象の関数の中では1つの処理(1 行の実行文)として扱われ、内部のカバレッジを測定することはで
きません。また、インライン関数は、テスト対象の関数から駆動された場合はそのカバレッジが同時
に測定されますが、インライン関数を直接駆動して単体テストやカバレッジ測定を行う事はできませ
ん。
そのため、上記の様にテスト対象関数に埋め込まれた状態でテストを行った上で、追加テストとし
て、インライン展開の指定やマクロ定義の形式を外して関数オブジェクト化し、インライン関数やマ
クロ定義された関数のみのカバレッジ計測を行う方法を推奨致します。
ツール起動・スタートアップに関する問題
011_03 : カバレッジマスターwinAMS でテスト環境を構築する際、オブジェクトコードに関して必要
な設定について教えてください

【質問】
カバレッジマスターwinAMS でテスト環境を構築する際、オブジェクトコードに関して必要な設定に
ついて教えてください。

【回答】
カバレッジマスターで、コンパイルされたオブジェクトコードを動作させるためには、必要な設定事項
があります。以下の手順を参考にしてください。
1)コンパイルされたオブジェクトコードを OMF 変換する
カバレッジマスターでテスト対象とするオブジェクトコードは、コンパイル&リンクされ、実行可能なオ
ブジェクトコードである必要があります。また、オブジェクトコードにはデバッグ情報が含まれている必
要があります。使用する開発環境にて、デバッグ情報を出力するオプションを ON にした状態で、コ
ンパイルを行ってください。最適化などその他のコンパイルオプションは、実際に製品に適用するもの
を使用して問題ありません。
ガイオのクロスコンパイラ(XASSV シリーズ)以外の他社製のコンパイラを使用する際には、オブジェク
トコードをカバレッジマスターが読み込める形式(*.xlo)のファイルに変換する必要があります。カバ
レッジマスターには、「OMF 変換」(OMF = Object Module Format)の機能が内蔵されており、この
機能を使用して他社のオブジェクトファイル(ルネサス HEW では *.abs、PM+では *.out など)をカ
バレッジマスターが読み込める形式(*.xlo)に変換する必要があります。この変換設定は、「OMF コ
ンバート」のビューで行います。
(参考 FAQ)オブジェクトファイル・OMF 変換に関する問題
2)スタートアップルーチンを正しく動作させる様に設定する
カバレッジマスターで使用するマイコンシミュレータは、実機のマイコンと同じ仕組みを持っています。
そのため、マイコンシミュレータを動作させるためには、スタックポインタ、レジスタ設定など、実際の製
品で動作する状態と同じにする必要があります。
カバレッジマスターは、このマイコン初期状態の設定を、オブジェクトに組み込まれたスタートアップル
ーチンを使用し、動作させて行います。そのため、マイコンシミュレータ起動時に、PC(プログラムカウ
ンタ)をリセットベクタに設定する必要があります。これはスタートアップコマンドファイルに記述するス
クリプト(マクロ)によって行われます。
※スタートアップコマンドファイル:「起動設定」ビューに設定されています
通常のマイコンには「@reset」というコマンドがあり、これをスタートアップコマンドファイルに設定してお
くことで、マイコンシミュレータ起動時に、マイコンのハードウエア仕様に基づきリセットシーケンス(リセ
ットベクタを読み出し PC にセットする)が動作するようになっています。
ただし、OS が介在する場合や、ユーザーが独自の設定をマイコンに行っている場合は、リセット時
のアドレスが PC 値に正しく設定されない場合が有ります。この際には、以下の様なスクリプトをスタ
ートアップコマンドファイルに設定して、リセット時のスタートアドレスを PC に設定します。リセット時の
スタートアドレス値は、マイコンのマニュアルやメモリマップ情報を参照して調べる必要があります。
set reg pc = 0x******** ; ←リセット時のスタートアドレス
リセットアドレスには、オブジェクトコードにあるシンボルの名称を使う事もできます。
(例)set reg pc = PowerON_Reset ; PowerON_Reset()がリセット時の関数の場合
このリセット時のアドレスが適切でない場合は、シミュレータ起動時に、
「Invalid Operation code found [code = 16] (pc=********)」
などのエラーが発生します。
3)スタートアップルーチンの終了位置を指定する
実際の製品動作では、スタートアップルーチン実行後、main()関数に移行しアプリケーションが実
行が開始しますが、カバレッジマスターでのテスト時には、スタートアップルーチン実行後、main()関
数は実行せず、直接テスト対象の関数へ移動し(PC がテスト対象関数にセットされる)、単体テス
トが行われます。
この際のスタートアップルーチンの終了位置を、「テスト設定」ビューの「初期設定終了アドレス」で
行います。ここで設定したアドレスが単体テストの起点となり、ここからテスト対象関数へ直接ジャ
ンプして実行が行われます。
main 関数の名称が「main」の場合であれば、デフォルトのまま main+0x0 を指定します。main
関数の名称が異なる場合には、そのシンボル名称を指定します。
参考 FAQ:011_02 : 「テスト設定」ビューにある「初期設定終了アドレス」とは何ですか?
000-01 : シミュレータがエラーで止まってしまいます。エラーの原因を調査するために、動作状態を
ログに出力して確認する方法はありませんか?

【質問】
シミュレータがエラーで止まってしまいます。エラーの原因を調査するために、動作状態をログに出力
して確認する方法はありませんか?ガイオのユーザーサポート宛に原因調査を依頼したいのですが、
どのようにするのが良いですか?

【回答】
このエラーが発生するまでの経過を、命令毎にログに出力することができます。このログを解析、確
認することで、ソースコードのどの場所で、シミュレータがエラーで停止してしまうのかの原因の手が
かりとすることができます。このログファイルを、弊社ユーザーサポート宛にお送りいただくと、原因調
査の手がかりにできます。
ユーザー自身でもおおよその原因をつかむことができますので、以下の方法で実行ログを確認して
下さい。
[実行ログの収集方法]
マイコンシミュレータをデバッガ UI モードで起動した後で、オプションメニューから指定できます。
1)SSTManager の「起動設定」画面で、シミュレーション開始終了の「自動的に開始」「自動的に
終了」を両方 OFF にします。
2)「シミュレータ起動」ボタンを押して、マイコンシミュレータ(SystemSimulator)を起動します。
3)「ツール」メニューから「オプション」を選択します。
4)下図のように、トレースオプションを全て ON にして、「適用」ボタンを押します。
5)SystemSimulator の「実行」メニューから「実行開始」を選択して、テストを開始し、エラーが発
生するまでテスト実行します
※上記のオプションを ON にした場合、テスト実行にかかる時間(実行パフォーマンス)は、2 桁程
度遅くなりますのでご了承下さい。
6)プロジェクトのカレントディレクトリに、ログファイル「systemg.log」が生成されます。
※このファイルに、エラーが発生するまでに実行されたアドレス等の情報が記録されています。
※なお、ログ採取後には、上記のオプションを OFF に戻して下さい。このオプションを使用すると、す
べての命令の実行ログを記録するため、テスト実行のパフォーマンスが著しく低下します。
[実行ログのサンプル]
マイコンやソースコードによって出力されるものは異なりますが、下記のようなフォーマットでログが出
力されます。
;Log File: C:\DEMO_winAMS_MCDC\UnitTest\systemg.log
;Start Log: Tue 18-Dec-2012 15:56:49
;
;
;%SYSTEMG-I-PROCESS, process "WinAMS" is started←「シミュレータ起動」ボタンで開始
;%SYSTEMG-I-GO, run program by process "WinAMS"
;traced to startup\#39, jumped from startup\#13←スタートアップ(ルーチン)実行
;traced to startup\#40← 40 行目を実行(以下実行した行番号を表示)
;traced to startup\#41
;traced to startup\#43
;traced to startup\#44
;traced to startup\#45
;traced to startup\#47
;traced to startup\#48
;traced to startup\#49
;traced to startup\#51
;traced to startup\#53
;traced to main\main\#15, jumped from startup\#53
;%SYSTEMG-I-STOPPROGRAM, stop program by process "WinAMS"←スタートアップ実行終了
;traced to main\main\#15+4
;%SYSTEMG-I-XIPC, function "main\func1" is called by process "WinAMS"←func1()テスト開始
;traced to main\func1\#95+4
;traced to main\func1\#95+8
;traced to main\func1\#96
;traced to main\func1\#96+4
;traced to main\func1\#124, jumped from main\func1\#96+4
;traced to main\func1\#124+4
;traced to main\func1\#125
;traced to main\func1\#127
;traced to main\main\#15+4, returned from main\func1\#127
;returned from func1←func1()からリターン(1 つ目のテストケースの実行が終了)
;%SYSTEMG-I-XIPC, function "main\func1" is called by process "WinAMS"←func1()テスト開始
;traced to main\func1\#95+4
;traced to main\func1\#95+8
;traced to main\func1\#96
;traced to main\func1\#96+4
;traced to main\func1\#98
;traced to main\func1\#98+4
;traced to main\func1\#98+8
;traced to main\func1\#98+12
;traced to main\func1\#98+16
;traced to main\func1\#104, jumped from main\func1\#98+16
;traced to main\func1\#104+4
;traced to main\func1\#104+8
;traced to main\func1\#105
;traced to main\func1\#105+4
;traced to main\func1\#105+8←func1()の中の、main.c 先頭から 105 行目を実行
;%SYSTEMG-E-SEM, write protection error←書き込み禁止エラーが発生
; `MEM::00000000'←アクセスしたアドレスは、0x00000000
;%SYSTEMG-I-PROCESS, process "WinAMS" was exited with [0]←異常を検知して終了
;%SYSTEMG-I-PROCESS, process "WinAMS" is terminated
;
;End Log: Tue 18-Dec-2012 15:57:03
;
上記のログのソースコードのサンプルは、下記のとおりです。105 行目にある「*ptr = 10;」を実行し
た時点で、書き込み禁止エラーが発生し、アドレスが 00000000 を指していますので、NULL ポイン
タに書き込みを行ったことが推測できます。
011_02 : 「テスト設定」ビューにある「初期設定終了アドレス」とは何ですか?

【質問】
「テスト設定」ビューにある「初期設定終了アドレス」とは何ですか?デフォルトでは「main+0x0」が
設定されていますが、これを変更する必要はあるのは、どのような場合ですか?

【回答】
(参考)マイコンリセットから単体テストへの動作:カバレッジマスターwinAMS チュートリアル (P16 か
ら抜粋)
カバレッジマスターwinAMS は、組込みマイコンの命令コードを実行するシミュレータ( System
Simulator)を使用して、テスト対象の関数を実行します。この動作は、評価ボード上に実装した
マイコンチップで動作させるのと同じ原理です。
通常、マイコンシステムは、電源投入時にハードウエアリセットがかかると、リセットベクタ(開始アドレ
ス)にプログラムカウンタ(PC)がセットされ、動作が始まります。プログラムの先頭には、「スタートアッ
プルーチン」と呼ばれるマイコン機能の初期化プログラムがあり、ここを実行して、スタックポインタ設
定やマイコンレジスタの初期化など、マイコンが動作するのに必要な設定が行われます。
スタートアップルーチンの実行の最後に、C言語の main()関数へのジャンプ命令が実行され、アプリ
ケーション実行のフェーズに移るのが、一般的なマイコンシステムです。
カバレッジマスターで単体テストを行う際は、まず最初に、このスタートアップルーチンを実行してシミ
ュレータのスタックポインタやレジスタを設定します。スタートアップルーチンが終了して、main()関数
へ移動した際に、アプリケーション実行のフェーズには移らず、シミュレータが強制的にプログラムカウ
ンタを評価対象の関数へセットして、単体
テストのフェーズへ移るようになっています。
「テスト設定」の項目にある、「初期設定終了アドレス」は、単体テストへの分岐点となるアドレスを
設定するためのものです。通常は main()関数のアドレスを指定しますが、特殊な事情で、スタート
アップルーチンの終了を他のアドレスに設定したい場合は、ここを利用できます。また、main 関数の
名称が異なる場合は、変更する必要があります。
単体テストのフェーズに入った後は、CSV ファイルからテストデータを変数にセットした後、テスト対
象の関数を実行します。複数のテストデータがある場合は、このテストデータセットと関数実行を繰
り返します。
(参考 FAQ:) 011_01 : 初期設定終了アドレスのオフセットは何を意味するのでしょうか?
011_01 : 初期設定終了アドレスのオフセットは何を意味するのでしょうか?

【質問】
初期設定終了アドレスに main+0x0 を設定した場合、main 関数の先頭アドレスにプログラムカウ
ンタが到達した時点で、テスト対象関数の先頭アドレスにジャンプすると認識していますが、テスト
対象関数実行後、制御の戻り先は決まっているのでしょうか?また、このオフセット値 0x0 は何を
意味するのでしょうか?

【回答】
テスト対象関数実行後には、「テスト設定」ビューの「初期設定終了アドレス」に指定したアドレス
に制御が戻ります。通常は、main+0x0 を設定し main 関数の先頭アドレスに制御を戻すように設
定します。通常は、main 関数の先頭、すなわち main+0x0 の指定で問題有りません。
ただし、カバレッジマスターwinAMS は、スタックポインタと実行アドレスが元に戻ったことを検出して、
被試験関数の実行が終了したと認識しているため、コンパイラ展開によって、main 関数の先頭ア
ドレスにスタックポインタを変更する命令がある場合には、被試験関数実行実行後に、main 関数
の先頭の命令を実行してしまい、スタックポインタが元に戻らず、テスト実行が終了しないことがあり
ます。この場合には、main 関数の先頭アドレス+数バイトを初期化終了アドレスに指定し、スタッ
クポインタを制御する命令を避けて制御を戻すように指定する必要があります。
このオフセット値が必要かどうかは、コンパイラのコード生成に依存しています。ご不明の場合は、
main 関数の先頭部分のコード展開の情報を添えて、弊社ユーザーサポートまでお問い合わせくだ
さい。
(参考 FAQ:) 011_02 : 「テスト設定」ビューにある「初期設定終了アドレス」とは何ですか?
326_01 : スタートアップコマンドファイルに記述するマクロで、任意のアドレスのデータを読み出して
処理を変えるには?

【質問】
マクロで任意のアドレスのデータを読み出して処理を変えたいと考えているのですが、C 言語のポイ
ンタのような使い方をすことは可能でしょうか。例えば、
もし (アドレス & 数値)== 0 ならば goto LABEL; // LABEL はスタートアップコマンドファイル内のラ
ベル
の様な処理をコマンドで実現することはできますか?

【回答】
可能です。まず、1つのシンボル(temp)をアドレス(100h)に 1 バイトの変数として定義します。コマ
ンドにも if 文+then 処理 の書式がありますので、これを使用します。ただし、if コマンドの式にアド
レス(100h 等)を直接記述出来ませんので、必ずアドレスを示すシンボルを作成して使用する必
要があります。
define/address/loc=1 temp = 100h
if (*temp & 10h) == 0 then goto LABEL // LABEL はスタートアップコマンドファイル内のラベル

【補足事項】
マクロコマンドの使用方法をまとめた資料を提供しています。下記のリンクからご覧下さい。
マクロ(シミュレータコマンド)の使い方(PDF ファイル: 389kB)
スタブ作成に関する問題
002_04 : スタブ関数の作成と管理には、どのような方法がありますか?

【質問】
スタブ関数の作成には、どのような方法がありますか?また、元の関数からスタブ関数への動作の
切り替えはどのようにして行うのですか?

【回答】
■スタブ関数の種類
まずスタブ関数には、「共通スタブ」「個別スタブ」の2つのタイプがあります。これは使い分けができ
ます。
「共通スタブ」とは、1つのサブ関数に対して1つのスタブ関数を作成し、すべての関数で共用する
(共通に使う)スタブです。
例 え ば 、 sub() を 呼 び 出 す 2 つ の 関 数 func1(), func2() が あ る 場 合 に 、 sub() の ス タ ブ 関 数
AMSTB_sub()を 1 つ作り、func1(), func2()のテスト両方に同じ AMSTB_sub()を使ってテストするこ
とになります。このため、テスト関数毎に、スタブに別々の機能を持たせることはできません。
これに対し「個別スタブ」とは、テスト関数毎に個別にスタブ関数を作るものです。例えば、sub()を
呼び出す2つの関数 func1(), func2()がある場合には、
func1()のテストに使う sub()のスタブ関数を AMSTB_func1_sub(),
func2()のテストに使う sub()のスタブ関数を AMSTB_func2_sub()
の様に個別に作ることになります。このため、テスト関数毎に、スタブに別々の機能を持たせること
ができます。
実際のユーザーの運用は、「個別スタブ」は自由度が高い反面、スタブ関数の個数が膨大になる
ことや、スタブを含めたオブジェクトサイズが大きくなることを避けるために、「共通スタブ」を使って運
用するケースが殆んどです。
■スタブ関数の切り替え方法
次に、上記で作成したスタブ関数を、どのように使うかの指定に2つの方法があります。
1 つ目は、「スタブ設定」のビューで作成したスタブのリストの「置換」スイッチを使って、元の関数をス
タブ関数に置換して実行する方法です。この方法ではチェックボックスに「置換」指定をしたものだ
けがスタブに入れ替わって実行され、「置換」をオフにすれば元の関数がそのまま実行されます。
考え方は非常にシンプルでわかりやすいのですが、この「置換」指定は、プロジェクトに登録した CSV
ファイルのテスト全てに有効であるため、CSV 毎にスタブのオン・オフを切り替えられない欠点がありま
す。
2 つ目は、作成したスタブの置換設定を、CSV ファイルに書き込んで管理し、「スタブ設定」のビュー
の「置換」スイッチは使用しない方法です。これは「CSV 別スタブ設定」の機能です。
この方法は、スタブの置換状態が CSV ファイルに書き込まれて、テストエビデンスとして残せること、
CSV 毎にスタブのオン・オフが自由に切り替えられるため、ほとんどのユーザーは、この管理方法を使
っています。

「CSV 別スタブ設定」については、弊社セミナーテキストの P.93 に参考資料がございます。
http://www.gaio.co.jp/users/cm1_3H3447Q7/7.CM1_text.pdf
002_07 : ライブラリ関数のスタブ関数を生成してテストに使用することはできますか?

【質問】
C 言語から呼ばれているグローバル関数として、ライブラリ関数があります。カバレッジマスターのスタ
ブ関数生成機能を用い、このライブラリ関数のスタブ関数を生成してテストに使用することはできま
すか?

【回答】
カバレッジマスターのスタブ作成機能でスタブ関数を作成するためには、元の関数が C 言語で、且
つデバッグ情報が出力されている必要があります。(通常は、ライブラリ関数にはデバッグ情報が出
力されていません)そのため、ライブラリ関数を元にスタブを作成することはできません。回避方法とし
ましては、ライブライ関数はリンクを行わず、その代わりに C 言語関数としての API を持つダミー関
数を作成しコンパイル&リンクしてください。
これにより、スタブ関数作成画面にライブラリ(サブ)関数のシンボル名称が表示されますので、これ
を元にスタブ関数を作成可能です。

【参考】
CasePlayer2 の『定義のない関数のスケルトンを生成』機能を使用して、「ライブラリ(実体のない)
関数」の空関数を作成することでスタブ化することができます。
定義のない関数をスケルトンを生成する場合、あらかじめ、仕様書生成の設定で、「スケルトン生
成のための情報を生成する」を指定し、仕様書生成を行う必要があります。CasePlayer2 は仕様
書生成時に、プロジェクトに登録されているソースを解析し、関数定義のない関数と変数定義の
ない変数の情報を収集します。
定義のない関数のスケルトンを生成は、「プロジェクト」-「定義のない関数のスケルトンを生成」か
ら作成できます。
002_05 : アセンブリ言語で記述された関数のスタブ関数を生成することはできますか?

【質問】
C 言語から呼ばれているグローバル関数として、アセンブリ言語で記述された関数があります。カバ
レッジマスターのスタブ関数生成機能を用い、このアセンブリ言語で記述された関数のスタブ関数
を生成してテストに使用することはできますか?

【回答】
カバレッジマスターのスタブ作成機能でスタブ関数を作成するためには、元の関数が C 言語の関数
である必要があります。アセンブラの関数の場合は、デバッグ情報の関数シンボルが C 言語関数と
は異なるため、これを元にスタブを作成することはできません。
回避方法としましては、アセンブル関数はリンクを行わず、その代わりに C 言語関数としての API を
持つダミー関数を作成しコンパイル&リンクしてください。
これにより、スタブ関数作成画面にサブ関数のシンボル名称が表示されますので、これを元にスタ
ブ関数を作成可能です。
002_06 : テスト対象関数がファイル内スタティック変数を使っています。別ソースのスタブ関数から
このスタティック変数を操作できますか?

【質問】
テスト対象関数がスタティック変数を使っています。スタブ関数からこのスタティック変数を操作した
いのですが、テスト関数とスタブ関数はソースファイルが別であるため、スタブ関数からは、テスト対
象関数のソースにあるスタティック関数にアクセスできません。どのようにすれば良いでしょうか?

【回答】
例えば以下の様なテスト対象関数 test_sample()と、サブ関数 sub_sample()があるとします。
----- source.c ---static int val=0; // スタブソース AMSTB_SrcFile.c からはアクセスできない
void test_sample(void)
{
val = 0; // 初期値
sub_sample(); // サブ関数 sub_sample で、val が変化
if( val = 0 )
{
分岐処理0
}
else
{
分岐処理1
}
}
void test_sub(void)
{
val を操作する処理
}
サブ関数のスタブ関数は、上記の source.c とは別の AMSTB_SrcFile.c に作成されるため、ここか
らはスタティック変数 val が参照できません。
そこで、スタティック変数 val を間接的に参照する方法を採ります。手順は以下の様にします。
1)スタブ関数のソースファイル内に、「static int val」と同じ型のグローバル変数のポインタを作成し
ます。
2)スタブ関数内で static int val を操作する代わりに、作成したポインタの実体を操作するコードを
作成します。
--AMSTB_SrcFile.c--
int *ptr_val;
void AMSTB_test_sub(void)
{
static int INPUT_param;
// CSV ファイルからの入力変数を作成
ptr_val[0] = INPUT_param; // 入力変数値を ptr_val[0]にセット
}
3)テスト CSV ファイルの入力変数に、上で作成した「ptr_val」(CSV 雛形作成画面で「アドレス設
定」オプションで登録)と、「ptr_val[0]」(CSV 雛形作成画面で「ポインタ添え字設定」オプションで
登録)を登録します。
4)ptr_val のテストデータには、スタティック変数 val のアドレス値を入力します。アドレス値はシンボ
ル名で代用できますので、テストデータには「source.c/val」を指定します。これにより、テスト実行
時には、スタブソースに作成した ptr_val に val のアドレスが入り、ptr_val[0]は val と同じメモリに
なります。
※ファイル内スタティック変数の書式は [ソースファイル名]/[変数名] です。
5)「INPUT_param」には val に与えたいテスト条件を入力します。
これにより、sub_sample()のスタブ関数実行時に、INPUT_param に与えたデータが ptr_val[0]に
代入されますが、ptr_val[0]は val と同じメモリを指していますので、結果的にスタブ関数から val の
値を変更できます。
002_01 : テスト毎(CSV ファイル単位)に共通スタブ関数の ON/OFF 指定を行う方法は?

【質問】
共通スタブ関数を作成していますが、「スタブ設定」の共通スタブにある「置換」チェックボックスを
ON にすると、プロジェクト全体のテストに対して、その関数がスタブされてしまいます。また、「置換」
を ON にした関数は必ずスタブされ、元の関数がテストできなくなります。テスト毎(CSV ファイル単
位)に共通スタブ関数の ON/OFF 指定を行うことはできませんか?

【回答】
可能です。共通スタブ関数の使用を ON/OFF する方法は、「置換」のスイッチを使用する方法の
他に、個別スタブの指定と同様に、CSV ファイル内にスタブの使用状況を管理する方法があります。
まず、「スタブ設定」の共通スタブにある「置換」チェックボックスは全て OFF にします。また、「スタブ
設定」にて、共通スタブ関数を予め作成しておきます。その上で、次の方法でスタブ関数の使用
設定を行います。
1.SSTManager の「テスト設定」で、テスト CSV ファイルを選択します
2.右側の「編集」ボタンで「モジュールテスト用 CSV 雛形作成」の画面を表示します
3.下にある「スタブ生成...」のボタンを押します
4.「テスト CSV 別スタブ設定」でスタブ生成オプションの「共通スタブ」を選択します
5.サブ関数に表示されたスタブ対象の関数を選択し「→」ボタンを押します
これにより、選択した CSV ファイルのテストの範囲でのみ、設定したスタブ関数が使用されます。
002_02 : 「スタブ設定」で作成したスタブ関数がシミュレータで実行できません。

【質問】
「スタブ設定」の機能でスタブ関数を作成し、スタブのソースファイルを開発環境でビルド、リンクしま
したが、シミュレータでテスト実行中にエラーとなってしまいます。(変数シンボルが存在しない等のエ
ラー。)何が原因でしょうか?

【回答】
ビルドしたスタブ関数が実行オブジェクトに入っていないことが考えられます。以下の原因が考えら
れます。
1)スタブソースファイルの先頭にある#ifdef WINAMS_STUB が無効になっている
カバレッジマスターで生成したスタブソースファイルの先頭には、スタブソース全体を囲む #ifdef
WINAMS_STUB が入っています。開発環境のプリプロセッサ設定で、WINAMS_STUB が#define
されていない場合は、スタブソースファイルはビルドの対象になりません。この場合は、
WINAMS_STUB を#define に加えてください。
2)開発環境のリンカの最適化でスタブ関数がリンクから外されている
カバレッジマスターで生成したスタブ関数は、アプリケーションのどこからも呼ばれない孤立した関数
となっています。このため、コンパイラやリンカの最適化によっては、スタブ関数が未使用関数として
認識され、リンクされずオブジェクトファイルに含まれないことがあります。この場合は、スタブソース内
にスタブ関数をリンクさせるためのダミーコードが必要となります。
コンパイラ/リンカの仕様に依存しますが、一般的には、スタブ関数の関数ポインタ配列を volatile
宣言によりグローバル領域に作成して置くことで、その関数はリンクの対象となります。
例えば、スタブ関数 AMSTB_func1、AMSTB_func2, AMSTB_func3 がある場合には、スタブソー
スファイルの最後に、
volatile int (*dummyfunc[])() = { AMSTB_func1, AMSTB_func2, AMSTB_func3 };
を追加することで対応可能です。
002_03 : 関数ポインタでコールされる関数のスタブ関数はどのようにして作成すればよいですか?

【質問】
テスト対象の関数から関数ポインタを使用して呼び出されるサブ関数があります。このサブ関数を
スタブするには、どのようにすれば良いですか?

【回答】
関数ポインタでコールされるサブ関数の「共通スタブ」関数は、関数ポインタに与えるテストデータ
(関数アドレス、またはシンボル)が示すサブ関数を、「スタブ設定」のリストより選択して作成するこ
とができます。
スタブに置換設定されたサブ関数は、関数ポインタにより呼び出される場合でも、スタブ関数に置
換されて実行されます。
ただし、「個別スタブ」関数は、テスト対象の関数から明示的に(スタティックに)コールされるサブ関
数のみが対象となるため、関数ポインタでコールされるサブ関数の「個別スタブ」関数は作成するこ
とができません。これは、カバレッジマスターの仕様上の制限となっています。
A03_01 : 同じ関数が何度も呼び出される場合、スタブ関数はどのように作成すると良いですか?

【質問】
テスト対象関数が同一のサブ関数を何度も呼び出す場合、戻り値などを呼び出し毎に変更した
り、呼び出し毎に与えた引数を確認するには、スタブ関数をどのように作成すれば良いですか?
【テスト対象関数の例】
// sub_func()が 2 回呼ばれている場合
int a,b,c,d;
void func(int x)
{
a = sub_func(x); // 1 回目
if ( a )b++;
c = sub_func(b); // 2 回目
if ( c )d++;
}

【回答】
上記の様に sub_func()が 2 回呼ばれる場合、このスタブ関数各々の戻り値を設定するための変
数(外部変数または関数内スタティック変数)と、渡された引数を格納するための配列を作成し、
これらの配列を CSV ファイルの入力/出力に指定します。例えば、下のようなスタブ関数を作成し
て、スタブ関数が呼ばれる毎に配列のインデックス番号(DBG_func_idx)がインクリメントされる様に
することで、呼び出し毎の戻り値の設定、渡された引数の出力が可能です。配列のインデクス数
は、想定される呼び出し回数分を作成する必要があります。
【sub_func()の スタブ関数の例】
int DBG_func_arg[2]; /* 関数の引数保存域(2 回分) */
int DBG_func_ret[2]; /* 関数の戻り値(2 回分) */
int DBG_func_idx; /* 上記配列用のインデックス*/
int AMSTB_sub_func(int i)
{
DBG_func_arg[DBG_func_idx] = i; /* 引数を保存域に転送*/
return DBG_func_ret[DBG_func_idx++]; /* 指定の戻り値でリターン*/
}
この外部変数 DBG_func_arg[]をテスト入力変数に、DBG_func_ret[]をテスト出力変数に指定し
ます。
上の説明と、テストデータのイメージをまとめた PDF ファイルを掲載しています。
テストデータ設定に関する問題
005_01 : ルネサスエレクトロニクス(旧 NEC エレクトロニクス)のコンパイラを使用していますが、i/o ポ
ートが入出力変数に指定できません

【質問】
ルネサスエレクトロニクス(旧 NEC エレクトロニクス)製の純正コンパイラを使用していますが、ソース
コードでアクセスしている i/o ポート名称が、CSV 雛形作成画面で選択できません。どのようにす
れば i/o ポートを入出力に指定できますか?

【回答】
旧 NEC 系のマイコン、V850 シリーズや 78K0 シリーズ向けの純正開発環境、PM+や CubeSuite
等で純正コンパイラを使用している場合、マイコンの i/o ポートやレジスタの定義を、ヘッダファイルで
はなく旧 NEC 独自の「デバイスファイル」でコンパイラに与える仕組みとなっているため、これらの i/o
ポートやレジスタの名称の情報は、コンパイルされたオブジェクトファイルには含まれていません。
このため、カバレッジマスターではこれらの名称を認識できず、CSV 雛形作成画面で選択ができま
せん。
これを回避するためには、CSV 雛形作成画面の「定義名リスト」に、ポート名称とビット幅、アドレス
の情報を指定する必要があります。通常、マイコンのポートやレジスタは多数あり、ユーザーが手動
で設定することは困難であるため、ガイオでは、「デバイスファイル」をお送り頂き、このファイルから
「定義名リストファイル」を作成するサポートを行っています。ご希望の場合は、弊社サポート専用
窓口宛にお問い合わせ下さい。
「定義名リストファイル」を入手後、CSV 雛形作成画面の「定義名リスト」のタブにて「インポート」を
行うことで、全てのポート名称を CSV ファイルの入出力に指定することが可能になります。
014_04 : マイコンによる仕様制限で、CSV ファイルから引数にデータが正しく入力されません。どの
ように回避すれば良いですか?

【質問】
マイコンの制限事項に CSV ファイルから引数にデータが正しく入力できない場合があると記載され
ています。この場合、どの様にしてこの問題を回避すれば良いですか?

【回答】
一部のマイコン開発環境(コンパイラ)では、オブジェクトファイルに含まれるデバッグ情報に、カバレッ
ジマスターが必要とする引数情報(引数の順序、ビット幅などの情報)を含んでいない場合があり、
CSV ファイルから正しく引数にデータが入力されないことがあります。
制限事項の情報は、下記 PDF ファイルに掲載されています。
Windows スタート → すべてのプログラム → winAMS → チュートリアル → カバレッジマスター
winAMS マイコン毎の制限
この場合は、テスト対象関数を呼び出すダミー関数(テストドライバ)を作成し、この関数をテストド
ライバに指定することにより、問題を回避することが可能です。

【参考資料】
ダミー関数(テストドライバ)の作成方法についての資料を掲載しています。
■ダミー関数を使った検証(V3.3 以前での利用方法解説 PDF 1.4MB)
※上記の資料は、V3.3 以降でも利用できますが、V3.3 以降では下の方法を推奨いたします。
■ダミー関数を使った検証(V3.3 以降での推奨方法 PDF0.12MB)
005_02 : ルネサスエレクトロニクスのマイコン RL78 を使用していますが、変数に代入したデータが
シミュレータ上で0になってしまいます。なにか設定が必要でしょうか?

【質問】
ルネサスエレクトロニクスのマイコン RL78 を使用していますが、変数に代入したデータがシミュレー
タ上で0になってしまいます。なにか設定が必要でしょうか?

【回答】
これは、RL78 のメモリのミラー領域の機能が、マイコンシミュレータに正しく設定されていないのが原
因です。
お客様がカバレッジマスターの MPU 型番指定で、「RL78」を選択している場合は、デフォルトではミ
ラー領域が指定されません。RL78 には型番が多数存在し、ミラー領域のアドレスが異なっているた
め、このアドレスは「direct コマンド」をスタートアップコマンドファイルに記述することで指定する必要
があります。
スタートアップコマンドファイルの最後に、以下の記述を追加頂くことで設定が可能です。
例:direct fmem_mirror set 0xf2000 0xffcff
(※ミラー領域が 0xf2000~0xffcff のマイコンの場合)
ミラー領域は 0xf0000~0xfffff の間を指定してください
ご利用の RL78 の型番のミラー領域のアドレスは、該当マイコン型番のハードウエアマニュアルをご
参照ください。

【参考情報】
ルネサスエレクトロニクスの WEB サイト
http://japan.renesas.com/products/mpumcu/rl78/index.jsp
にも、RL78 ファミリの情報がございます。
この WEB ページに、RL78/G** RL78/F** などの派生チップの情報があります。御社のご利用のマ
イコン型番のページを参照してください。「ドキュメント」のタブで、ご利用の型番毎の「ユーザーズマ
ニュアル ハードウェア編」が参照できます。各マニュアルの「ミラー領域」の章に、ミラーされているア
ドレスが記載されています。
001_01 : ヘッダファイルに定義した#define シンボル名をテスト CSV に利用することはできますか?

【質問】
ヘッダファイルに#define シンボルとして定義した数値や変数名、構造体メンバーなどを、テスト
CSV に使用することはできますか?

【回答】
CasePlayer2 を連携して使用する場合においては使用することができます。#define シンボル情報
はコンパイラのプリプロセッサによって処理されるため、コンパイル時にコードに埋め込まれてしまい、オ
ブジェクトファイルにシンボル情報としては入りません。このため、#define の情報は CasePlayer2 の
解析結果の#define 一覧の情報として、カバレッジマスターに持ち込まれます。
このためには、以下の設定が行われていることを確認してください。
1.CasePlayer2 の「設定」タブの「仕様書生成」のダイアログを表示します
2.詳細設定の項目のうち、以下の設定が ON になっていることを確認する
・詳細解析を行う
・#define 一覧(ブラウザ情報)を生成する
・winAMS 用プログラム解析情報を生成する
CasePlayer2 により抽出され、利用可能な定義は、モジュールテスト用 CSV 雛形作成の画面の
「定義名リスト」タブに表示されます。(数値定義はのぞく)
カバレッジマスターで利用できる#define 定義には以下の条件があります。
<定義可能な例>
単純な数値定義
#define ABC (100) /* 'ABC'をテストデータの代わりに記述できます */
単純なグローバル変数
#define G_VAR1 g_var1 /* g_var1 はグローバル変数 */
単純なグローバル変数の配列要素
#define G_A0 g_ary[0] /* g_ary は配列型のグローバル変数 */
単純なグローバル変数のメンバやビットフィールド
#define BIT1 g_st.bit1 /* g_st はビットフィールドのグローバル変数 */
#define MEMM g_ptr- >m /* g_ptr は構造体ポインタ型のグローバル変数 */
型キャスト付の I/O アドレス
#define B_LED (*(volatile unsigned short*) 0x00080000) /* 0x00080000#U2#2 */
#define R_LED ((volatile unsigned short*) 0x00080020) /* 0x00080020#U2#2 */
レジスタマップ
#define P1 (*(volatile struct p1*) 0x00080100)
<定義ができない例>
演算を含む数値定義
#define ABC (100*2) /* 定義に演算が含まれる物は使用できません */
ファイル内スタティック変数
#define S_VAR1 s_var1 /* s_var1 はファイル内スタティック変数 */
関数・マクロ関数
#define MFUNC(a) func1(a)
型キャスト付のグローバル変数
#define G_CPTR (char*)g_ptr
関数内ローカルなシンボルを使用しているもの
例えば、関数内 static 変数や、関数内ローカルな構造体のレジスタマップなど。
014_01 : 構造体を引数に持つ関数を単体テストする際に、「WinAMS ポインタ割り当ての設定
を行っていません(関数@構造体数)」のエラーが出てしまいます。

【質問】
構造体を引数に持つ関数を単体テストする際に、「WinAMS ポインタ割り当ての設定を行ってい
ません(関数@構造体数)」のエラーが出てしまいます。構造体引数のメンバーにはポインタ変数は
1つもないのですが、なぜこのエラーが出力されるのでしょうか?

【回答】
構造体が引数になっている場合や、リターン値が構造体になっている場合は、通常のコンパイラの
コード展開では、評価対象の関数がコールされる前に呼びだし側の親関数の中に、その構造体の
エリアを確保するコード展開が作られます。
カバレッジマスターでこの様な関数をテストする際にも、カバレッジマスター側で通常は親関数に展
開されている構造体エリアの確保の動作を行う必要があり、これを「ポインタ割り当てエリア設定」
に指定されたエリアを使用して行うようになっています。
これはコンパイラのコード展開に依存するため、まれに例外もありますが、構造体が引数やリターン
値に指定されているときには、ほとんどが「ポインタ割り当てエリア設定」が必要です。
※マイコンやご利用のコンパイラ(開発環境)によっては、引数に構造体(ポインタでない実体)を渡
す機能がサポートされていない場合もあります。
014_02 : ダミー関数から static 関数を呼び出してテストを行うには、どのようにすれば良いですか?

【質問】
「開始変数代入~終了変数代入」の機能を使用して、テスト対象関数を呼び出すダミー関数を
作成してテストを行っています。しかし、テスト対象の関数が static 関数の場合、別ファイルにある
ダミー関数からテスト対象の static 関数を呼び出すことができません。どのようにすればテスト可能
でしょうか?

【回答】
static 宣言された関数は、ダミー関数から直接呼び出すことはできませんので、この場合は関数ポ
インタを使用して、検証対象となる static 関数を間接的に呼び出してテストを行います。
(例)
int (*DBG_test_func)(int);
dummy()
{
while (1)
{
DBG_IN = 1;
dbg_out = (*DBG_test_func)(dbg_a); // dbg_a は関数ポインタ変数
DBG_OUT = 1;
}
}
CSV には、関数ポインタ変数を Input 変数へ登録してください。この関数ポインタ変数のデータとし
て検証対象関数を設定すれば、static 関数をダミー関数から呼び出すことができます。
014_03 : 引数に構造体を持つ関数をテストする場合に、CSV 雛形作成の変数一覧に引数の構
造体が表示されない

【質問】
引数に構造体を持つ関数をテストする場合に、モジュールテスト用 CSV 雛型作成時に構造体引
数のメンバーが表示されず、変数指定ができません。どのようにすれば、構造体引数をテスト対象
の変数として指定できますか?

【回答】
一部のマイコン開発環境(コンパイラ)では、オブジェクトファイルに含まれるデバッグ情報に、カバレッ
ジマスターが必要とする引数情報を含んでいない場合があり、このため関数の引数をテスト入出
力変数に設定出来ないことがあります。この場合は、ダミー関数(テストドライバ)により回避するこ
とが可能です。
これには、設定できない構造体の引数にグローバル変数を介して値を設定し、テスト対象の関数
を繰り返し呼び出す永久ループを持つダミー関数(テストドライバ)を作成します。その中に単体テ
ストの開始と終了のトリガーを設定するための「開始変数」と「終了変数」の機能を使用して、テス
ト対象の範囲を設定する方法を用います。

【参考資料】
ダミー関数(テストドライバ)の作成方法についての資料を掲載しています。
■ダミー関数を使った検証(V3.3 以前での利用方法解説 PDF 1.4MB)
※上記の資料は、V3.3 以降でも利用できますが、V3.3 以降では下の方法を推奨いたします。
■ダミー関数を使った検証(V3.3 以降での推奨方法 PDF0.12MB)
022_01 : const 変数が CSV 雛形作成画面の入出力変数ツリーに表示されず、テスト対象変数
として指定できません。

【質問】
const 変数がモジュールテスト用 CSV 雛形作成画面の入出力変数ツリーに表示されず、テスト
対象変数として指定できません。どのようにすれば、const 変数を指定できますか?

【回答】
モジュールテスト用 CSV 雛型作成画面の左下に表示されている表示オプションの「const データも
表示する」のチェックを ON にしてください。const 変数が入出力変数ツリーに表示されます。
022_02 : const 変数を入力変数に指定して、CSV ファイルから定数値を書き換えてテストする方
法

【質問】
定数値が決められている const 変数を入力変数に指定して、テスト毎に CSV ファイルから const
値を変更してテストを行うことはできますか?

【回答】
可能です。通常の変数と同じように入力変数(CSV)に登録して、テストデータを設定してください。
ただし、const 変数は ROM 領域(Read 属性)に割り当てられますので、このままでは CSV ファイル
からその領域を書き換えることができません。そのため、該当する ROM 領域の属性を書き込み可
能(Read/Write 属性)に変更するために、スタートアップコマンドファイルに設定変更のコマンドを追
加する必要があります。
例) const 定数が割り付けられているメモリ空間が、
0x1000 ~ 0x2000 番地としたときを想定したときのコマンド(メモリアサイン)記述例です。
実アプリの const 定数の割り付け位置は、リンク map ファイル等でご確認ください。
assign/read/write 0x1000:0x2000

(参考)
全てのメモリ領域を書き込み可能属性(Read/Write 属性)に強制的に指定することもできます。
カバレッジマスターの「起動設定」のビューにある「全てのメモリ領域をアサイン」のオプションを ON に
してください。この場合は、上記のスタートアップコマンドファイルへの追加は必要ありません。
ただし、このオプションは、マイコン全てのメモリ領域に RAM を配置した状態と同じになります。この
ため、プログラムの不具合による ROM 領域への書き込み、未使用アドレスへの読み出し/書き込
み、NULL ポインタアクセスなどのメモリエラーの検出は行えません。
103_01 : 可変長引数を持つ関数をテスト対象にするには、どのように設定すればよいですか?

【質問】
可変長引数をもつ関数をテスト対象にしたいのですが、入出力変数の指定ができません。どのよ
うにすればテストが可能ですか?

【回答】
可変長引数をもつ関数は、カバレッジマスターの機能制限となっており、テスト対象関数に指定す
ることはできません。
回避方法としましては、ダミー関数(テストドライバ)を作成して頂く方法がございます。グローバル
変数等を介して引数を渡し、可変長引数の関数を呼び出すダミー関数を作成します。
詳細はダミー関数作成関する解説(PDF ファイル)をご覧下さい。(014_03_ummy_func.pdf)
104_01 : 配列の要素数、メンバ数が多い変数や構造体を CSV ファイルを使用せず、まとめて初
期化する方法はありますか?

【質問】
構造体配列を入出力変数に指定して単体テストを行いたいのですが、配列の要素数、メンバ数
共に多いと、CSV ファイルへの登録にかなりの手間を要することになります。CSV ファイルを使用し
ないで、配列の要素数、メンバ数が多い変数の条件を初期化する方法はありませんか?

【回答】
配列の要素数、メンバ数が多い変数を初期化するには、以下の方法があります。
1.「初期値設定」の機能を使用する方法
1-1.テストデータ(テストケース)毎に変数を初期化する必要がある場合
この場合は、カバレッジマスターの「初期値設定」の機能を使用して、CSV ファイルからテストデータ
を変数に与える前に、構造体などの変数、メンバーを指定した値で初期化することができます。
「モジュールテスト用 CSV 雛形作成」画面の下にある「初期値...」のボタンで、「初期値設定」機能
が表示されます。上部にある「テストデータ毎に初期化する」のオプションを ON にすると、テストデー
タ(テストケース)毎に初期化が行われます。
1-2.テスト開始時に初回のみ変数を初期化する場合
上記1の「初期値設定」の機能にて、「テストデータ毎に初期化する」のオプションを OFF にして使
用してください。
2.テストドライバを作成する方法
構造体ポインタ変数や配列などまとまったデータを初期化する場合であれば、テストドライバソース
に初期値を代入したダミー変数を作成し、そのポインタをテスト対象の構造体ポインタ変数や配列
に CSV ファイルで指定する方法があります。この場合は、作成したテストドライバソースをコンパイル
&リンクする必要があります。
テスト条件として変更が必要な変数のみ CSV ファイルに指定して入力することで、CSV ファイルへの
登録の手間を省くことが可能です。
106_01 : エリア割り当てを使用してポインタのメモリ割り付けを使用した際に、ポインタに NULL を
与える方法はありますか?

【質問】
ポインタ変数を含む関数をテストする際に、CSV ファイルにてエリア割り当ての機能を使用して、ポ
インタの実体割り付けを行っています。このテスト CSV ファイルで、ポインタの NULL テストを行うに
は、どのようにすれば良いですか?

【回答】
ポインタ変数のエリア割り当てで作成した「$」付の入力項目に、データ(変数の割り付け個数)とし
て「0」を指定してください。この場合は、ポインタに NULL が指定され、実体の割り付けは行われま
せん。なお、この機能はカバレッジマスターV3.1 以降で使用可能です。
111_01 : void 型ポインタ変数を CSV ファイルの入出力変数に指定するには、どのようにすれば良
いですか?

【質問】
引数に void ポインタを持つ関数をテストしようとしています。渡された void 型のポインタ変数は、関
数内で他の型にキャストされています。このような void 型ポインタ変数を CSV ファイルの入出力変
数に指定するには、どのようにすれば良いですか?

【回答】
void 型のポインタ変数は、CSV ファイルの入出力変数に直接指定することはできません。この場
合は、レジスタマップ設定の機能を使用して、void ポインタに型を持たせた定義名を作成し、この
定義名を変数の代わりに CSV ファイルに登録する方法を使用します。

詳細は関数引数が VOID ポインタの場合に関する解説(PDF ファイル)をご覧下さい。
(111_01_void_pointer.pdf)
111_02 : 引数にダブルポインタがある場合は、どのような手順で INPUT に追加すればよいでしょう
か?

【質問】
引数にダブルポインタがある場合は、どのような手順で INPUT に追加すればよいでしょうか?

【回答】
まず、このポインタ変数を INPUT に、「アドレス指定」もしくは「エリア割り当て」の機能を使用して、
アドレスの割り付けを行う入力項目を作成します。つぎに同じポインタ変数を再度加え、「ポインタ
添え字設定」を使用して実体を指定してください。この時点で、変数選択のツリーにこの実体が表
示されます。この実体もポインタですので、再度前述と同様にして、アドレスの割り付けと実体の指
定を行います。

ダブルポインタの引数 「int **dptrint」に対する設定手順を解説した参考資料
116_01 : 関数内のローカル変数を単体テストの入出力変数に指定する方法はありませんか?

【質問】
関数内のローカル変数を単体テストの入出力変数に指定する方法はありませんか?

【回答】
ローカル変数は、CSV ファイルの入出力変数に指定することはできません。カバレッジマスターの
CSV ファイルに指定可能な変数は、関数実行前にメモリ上のアドレスが確定可能なものに限られ
ます。ローカル変数は関数実行後にスタック上に生成される変数であるため、入出力の対象とする
ことはできません。回避策としましては、グローバル変数、または関数内スタティック変数に変更して
頂くしかございません。
319_01 : enum(列挙定数)を CSV ファイルの入出力変数に指定することはできますか?

【質問】
enum(列挙定数)を CSV ファイルの入出力変数に指定することはできますか?

【回答】
enum(列挙定数)の扱いは、コンパイラの仕様に依存して異なっており、2つの場合があります。コン
パイル後のオブジェクトコードのデバッグ情報に enum の情報が通常の変数と同様に出力されるコ
ンパイラ場合は、CSV 雛形作成画面の変数ツリービューに、通常の変数と同様に表示され指定
することができます。enum(列挙定数)がコンパイラのプリプロセッサによって処理され、コンパイル後
のオブジェクトコードのデバッグ情報に出力されないコンパイラの場合は、カバレッジマスターでこの
enum を扱うことはできません。
514_01 : 関数ポインタを含む関数を単体テストする場合、どのようにして関数のアドレスを指定す
ればよいですか?

【質問】
関数ポインタを含む関数の場合、処理関数のアドレスをテストケースとして入力したいのですが、
関数のアドレスはリンク時に変わってしまう可能性があります。この場合、どのようにして関数のアド
レスを指定すればよいですか?
/* テスト対象関数 */
int exec_func(int (*func)(void))
int eRet = -1;
if ( NULL != func )
{
eRet = (func)();
}
return eRet;
}
/* 関数ポインタで呼び出される関数 */
int subfunc(void)
{
return 1;
}

【回答】
この関数の場合、CSV 雛形作成画面にて入力変数(INPUT)に引数 func(ポインタ)を「アドレス
設定」のオプションを使っ追加します。テストデータには、関数 subfunc のアドレスを直値で指定す
る方法の他に、呼び出される関数のシンボル名「subfunc」を記述することも可能です。
535_01 :入出力のない関数のカバレッジテストを行うためには、どのようにすれば良いですか?

【質問】
入出力のない関数のカバレッジテストを行うためには、どのようにすれば良いですか?

【回答】
カバレッジマスターで対象関数は、テストデータ(テストケース)がトリガーとなって実行が行われます。
このため、入出力のない関数であっても、少なくとも1つのテストデータを設定する必要があります。
関数の実行に関係のない任意のグローバル変数を1つ選択して、これを入力変数にした CSV ファ
イルを作成してください。テストデータには、任意の値(0 で可)を設定してください。この CSV ファイ
ルを指定してシミュレータ起動を行うと、関数が実行されます。
480_01 :全ての引数を入力に指定しているにも関わらず「too few argument(s)」の警告が出力さ
れます。

【質問】
関数の全ての引数を入力変数(INPUT)に指定しているにも関わらず、下記の警告が出ます。引
数の個数が少ないと言う意味だと思いますが、どうしてこの警告が出るのでしょうか?
%SYSTEMG-I-XIPC, function "(関数名)" is called by process "WinAMS"
%SYSTEMG-W-CALL, too few argument(s) [0] to function "(関数名)" [1]

【回答】
この警告は、コンパイラが、引数をスタックに生成せず、レジスタに直接渡すコードを生成している
時に表示されているものです。このメッセージはマイコンシミュレータ(XAIL)が出力していますが、引
数がある場合で、スタックに引数が積まれていない場合に、これを検知して、引数とスタック生成の
数が合わない旨をメッセージとして出力しています。
この表示は警告レベル(W)であり、問題はなくそのままテスト動作可能です。
(※補足事項)引数は全て入力変数に指定する必要があります。
301_01 : I/O 制御で、while()ループでハードウェアの信号待ちを行っている関数をテストするに
は?

【質問】
関数の処理に、I/O 制御でハードウェアの信号待ちを行っている while()ループがあり、ループをブ
レイクするためには、関数実行中に i/o ポートの値を変化させる必要があります。どのようにすれば、
while()ループのハードウェアの信号待ちを抜けることができますか?

【回答】
関数の中で、I/O レジスタの信号を監視している個所があるとき、シミュレーションではこの部分は
永久ループとなり、そのままでは検証することができません。I/O レジスタの信号監視によるループ
が存在する場合、処理の形態によってテストデータ CSV の記述で対策できるケースと、スタートア
ップコマンドファイルに細工をしてループから抜けるように対策しなければならないケースがあります。
(1)I/O レジスタの信号が ON になるのを単に待っている場合
#define PORT1 *(volatile unsigned char *)0xffffff50 // port1 入力
void sample ()
{
: 処理
while ((PORT1 & 0x01) == 0) ; // 信号が ON になるまで待つ!
: 処理
}
上記の様な場合であれば、i/o ポート PORT1 の値をテストケースの 1 つとして 0x01 にセットするだ
けで、while()ループを抜けることができます。PORT1 は直接アドレスがキャストされており、シンボル
情報がないため、この PORT1 を CSV ファイルの入力項目とするためには、CSV 雛形作成画面にて
INPUT への変数追加に「i/o 作成」ボタンを使用します。
i/o 作成の画面にて、種別に「アドレス」を指定し、アドレスに「0xffffff50」、型に「unsigned char」
を指定することで、入力変数として PORT1 を扱うことができます。この際に、CSV ファイルの変数欄
には、「0xffffff50#U1#1」と記載されます。
(2)関数内で I/O レジスタをクリアしてから、信号が ON になるのを待っている場合
#define PORT1 *(volatile unsigned char *)0xffffff50 // port1 入力
void sample ()
{
: 処理
PORT1 = 0 ; // I/O レジスタをクリア
while ((PORT1 & 0x01) == 0) ; // 信号が ON になるまで待つ!
: 処理
}
この場合、信号の監視をする直前で、I/O レジスタをクリアしていますので、上記(1)の方法で I/O
レジスタへのデータを入力しても効果はありません。この場合には、シミュレータの機能を使用して、
関数実行途中に PORT1 の値を書き換える動作を行わせます。これは、スタートアップコマンドファイ
ルに、I/O レジスタが参照されたタイミングで PORT1 の値を 1 に変化させるコマンド(シミュレータのス
クリプト)を定義することにより行います。
スタートアップコマンドファイルに以下の処理を追加します。このコマンドは、PORT1(0ffffff50h 番地)
の参照(read)をトリガーにして、dataset に定義した“PORT1”へ信号 0x01 を設定するマクロを実
行するものです。
; “dataset”マクロの定義
macro dataset
store/loc=1 0ffffff50h = 01h ;“PORT1”へ信号 0x01 を設定
mend
; 0xffffff50 番地を参照しようとしたら、”dataset”マクロを実行するように定義
set do/read=0ffffff50h#1 dataset

【参考情報】
スタートアップのマクロコマンドの仕様一覧は、以下のメニュー操作より参照が可能です。
SSTManager の ヘルプメニューより[ヘルプ]→[シミュレータマニュアル]にて、ヘルプファイルを表示し
ます。
ヘルプファイルの目次 の シートより[デバッガ]→[コマンド/メッセージ]→[SystemG]→[デバッガコマン
ド一覧]に、
解説がございます。
各コマンドの リファレンスについては[デバッガコマンド一覧] 配下の [コマンド解説] を 参照してく
ださい。

【マクロの使用方法:参考技術情報】
ユーザー向け技術サポート情報のページに、マクロ(シミュレータコマンド)の使い方(上級者ユーザ
ー向け)が PDF ファイルで掲載されています。スタートアップコマンドファイルに設定するマクロコマンド
(スクリプト)の使用方法を、ご質問の多い例を上げて解説しています。
■マクロ(シミュレータコマンド)の使い方※上級者ユーザー向け
301_02 : アセンブラで記述された関数のテストを行うことはできますか?

【質問】
アセンブラで記述した関数の単体テストを行うことはできますか?

【回答】
はい、可能です。カバレッジマスターは、アセンブラで記述された関数の単体テストと C0 カバレッジ
計測を行う機能を持ちます。
C 言語の関数は、関数名や{}で囲まれた範囲を関数と定義するような決まった構造がありますが、
アセンブラ関数には決まった構造はなく、ユーザーが自由に任意のアドレスに命令(ニューモニック)
を記述し、アセンブラ関数を作成することができます。
<アセンブラ関数の例>
開始位置ラベル→SUB_ASM_FUNC:
//アセンブラ処理↓例
SUBR:
MOVR6, #12H
MOVR7, #10H
ADDR6, R7
MOVR0, R6
終了位置ラベル→END_SUB_ASM_FUNC:
NOP
このため、アセンブラ関数をカバレッジマスターでテストするためには、ユーザーが自分で関数の開始
位置と関数の終了位置を指定して、アセンブラ関数の範囲を定義する必要があります。
上記の場合であれば、アセンブラ関数の先頭は SUB_ASM_FUNC のラベル関数の終了位置は、
END_SUB_ASM_FUNC のラベルになります。
アセンブラ関数の単体テストを行う手順は以下の通りです。
1)「開始アドレス~終了アドレス-テスト用 CSV」を選択して CSV 雛形作成画面を表示する
2)「スタートアドレスに飛んで実行」のチェックボックスを ON にする。
(このオプションにより、指定したアセンブラ開始アドレスからテストが実行されます。OFF にした場合
は、スタートアップコマンドファイルなどで、アセンブラ開始アドレスへ pc(プログラムカウンタ)をセットす
る必要があります。)
3)「アセンブラのテスト」のチェックボックスを ON にする
(このオプションにより、開始アドレスから終了アドレスまでの C0 カバレッジが記録されます。)
4)「変数一覧」のタブを表示し、表示オプションの「アセンブラのラベルを含む」をチェックする
5)一覧から関数の先頭のラベルを選択して開始アドレスの「決定→」を押す
6)一覧から関数の終了アドレスを示すラベルを選択して、終了アドレスの「決定→」を押す。終了
位置を示すラベルがない場合は、終了アドレスを直接入力する
7)テストに必要な INPUT/OUTPUT を指定する(アセンブラ関数のテストの場合は、内部レジスタを
直接入出力に指定することができます。)
※ ただし、C 関数の中に記述されたインラインアセンブラについては、実行は可能ですが、命令ご
とのカバレッジを計測することはできません。
301_03 : ポインタを使用した複雑なチェーン(リスト)構造を持った階層の深い変数にテストデータ
を設定する場合、効率の良い方法を教えてください。

【質問】
ポインタを使用した複雑なチェーン(リスト)構造を持った階層の深い変数をテストデータとして扱って
います。ポインタを1つ1つ指定すればテスト可能であることは理解していますが、変数の指定が複
雑で工数がかかります。効率の良いテストデータの指定方法はありませんか?

【回答】
ポインタを使用した複雑なチェーン(リスト)構造を持った階層の深い変数をテストデータとして扱う
場合、カバレッジマスターwinAMS でテストする事は可能ですが、変数の指定が複雑になります。こ
の FAQ では、ダミー変数を利用して簡単にテストデータを設定する方法を紹介します。
サンプルプログラム(main.h)
struct ST_PARAM
{
int data;
int ret_code;
} gb_result;
typedef struct st_Leaf {
int No;
void *pstCmd;
} T_Leaf;
typedef struct st_Second {
int No;
T_Leaf *pstLeaf;
} T_Second;
typedef struct st_Top {
int No;
T_Second *pstSecond;
} T_Top;
typedef struct TEST
{
int enable;
int mode;
int input;
} T_test1;
サンプルプログラム(main.c)
void func1(T_Top * param)
{
int enable,mode,input;
enable = ( (T_test1 *)(param->pstSecond->pstLeaf->pstCmd) ) ->
enable;
mode
= ( (T_test1 *)(param->pstSecond->pstLeaf->pstCmd) ) ->
mode;
input = ( (T_test1 *)(param->pstSecond->pstLeaf->pstCmd) ) ->
input;
if( enable )
{
switch( mode )
{
case 0:
gb_result.data = input;
break;
case 1:
gb_result.data = input * 10;
break;
case 2:
gb_result.data = input * 100;
break;
case 3:
if( input>100 )
gb_result.data = 10000;
else
gb_result.data = input*100;
break;
default:
gb_result.data = -1;
}
// return code
gb_result.ret_code = TRUE;
}
else
{
gb_result.data = 0;
gb_result.ret_code = FALSE;
}
}
手順1
テストデータを設定する為のダミーシンボルを作成します。
※ダミーシンボルを作成するファイルは運用に合わせて、任意で決定して下さい。
作成したファイルをコンパイルして、テスト対象オブジェクトにリンクする必要があります。
サンプルプログラム(dummy.c)
T_test1 DBG_test1;// テストデータ設定対象変数
T_Leaf DBG_Leaf = { 0, (void *)&DBG_test1};
T_Second DBG_Second = { 0, &DBG_Leaf};
T_Top DBG_param = { 0, &DBG_Second }; // テスト対象関数の引数用
手順2
CSV 雛形作成から、関数引数である func1@parm をアドレス設定で INPUT に登録します。
手順3
ダミーシンボルである DBG_test1.enable、DBG_test1.mode、DBG_test1.input を INPUT に登録
します。
手順4
CSV 編集(または Excel)にてテスト対象関数に指定するダミー変数のアドレスを引数にポインタアド
レスとして記述します。
※複雑なチェーン構造について、ツールで設定せずにダミー変数を使って記述する事になります。
シミュレータ実行に関する問題
000-01 : シミュレータがエラーで止まってしまいます。エラーの原因を調査するために、動作状態を
ログに出力して確認する方法はありませんか?

【質問】
シミュレータがエラーで止まってしまいます。エラーの原因を調査するために、動作状態をログに出力
して確認する方法はありませんか?ガイオのユーザーサポート宛に原因調査を依頼したいのですが、
どのようにするのが良いですか?

【回答】
このエラーが発生するまでの経過を、命令毎にログに出力することができます。このログを解析、確
認することで、ソースコードのどの場所で、シミュレータがエラーで停止してしまうのかの原因の手が
かりとすることができます。このログファイルを、弊社ユーザーサポート宛にお送りいただくと、原因調
査の手がかりにできます。
ユーザー自身でもおおよその原因をつかむことができますので、以下の方法で実行ログを確認して
下さい。
[実行ログの収集方法]
マイコンシミュレータをデバッガ UI モードで起動した後で、オプションメニューから指定できます。
1)SSTManager の「起動設定」画面で、シミュレーション開始終了の「自動的に開始」「自動的に
終了」を両方 OFF にします。
2)「シミュレータ起動」ボタンを押して、マイコンシミュレータ(SystemSimulator)を起動します。
3)「ツール」メニューから「オプション」を選択します。
4)下図のように、トレースオプションを全て ON にして、「適用」ボタンを押します。
5)SystemSimulator の「実行」メニューから「実行開始」を選択して、テストを開始し、エラーが発
生するまでテスト実行します
※上記のオプションを ON にした場合、テスト実行にかかる時間(実行パフォーマンス)は、2 桁程
度遅くなりますのでご了承下さい。
6)プロジェクトのカレントディレクトリに、ログファイル「systemg.log」が生成されます。
※このファイルに、エラーが発生するまでに実行されたアドレス等の情報が記録されています。
※なお、ログ採取後には、上記のオプションを OFF に戻して下さい。このオプションを使用すると、す
べての命令の実行ログを記録するため、テスト実行のパフォーマンスが著しく低下します。
[実行ログのサンプル]
マイコンやソースコードによって出力されるものは異なりますが、下記のようなフォーマットでログが出
力されます。
;Log File: C:\DEMO_winAMS_MCDC\UnitTest\systemg.log
;Start Log: Tue 18-Dec-2012 15:56:49
;
;
;%SYSTEMG-I-PROCESS, process "WinAMS" is started←「シミュレータ起動」ボタンで開始
;%SYSTEMG-I-GO, run program by process "WinAMS"
;traced to startup\#39, jumped from startup\#13←スタートアップ(ルーチン)実行
;traced to startup\#40← 40 行目を実行(以下実行した行番号を表示)
;traced to startup\#41
;traced to startup\#43
;traced to startup\#44
;traced to startup\#45
;traced to startup\#47
;traced to startup\#48
;traced to startup\#49
;traced to startup\#51
;traced to startup\#53
;traced to main\main\#15, jumped from startup\#53
;%SYSTEMG-I-STOPPROGRAM, stop program by process "WinAMS"←スタートアップ実行終了
;traced to main\main\#15+4
;%SYSTEMG-I-XIPC, function "main\func1" is called by process "WinAMS"←func1()テスト開始
;traced to main\func1\#95+4
;traced to main\func1\#95+8
;traced to main\func1\#96
;traced to main\func1\#96+4
;traced to main\func1\#124, jumped from main\func1\#96+4
;traced to main\func1\#124+4
;traced to main\func1\#125
;traced to main\func1\#127
;traced to main\main\#15+4, returned from main\func1\#127
;returned from func1←func1()からリターン(1 つ目のテストケースの実行が終了)
;%SYSTEMG-I-XIPC, function "main\func1" is called by process "WinAMS"←func1()テスト開始
;traced to main\func1\#95+4
;traced to main\func1\#95+8
;traced to main\func1\#96
;traced to main\func1\#96+4
;traced to main\func1\#98
;traced to main\func1\#98+4
;traced to main\func1\#98+8
;traced to main\func1\#98+12
;traced to main\func1\#98+16
;traced to main\func1\#104, jumped from main\func1\#98+16
;traced to main\func1\#104+4
;traced to main\func1\#104+8
;traced to main\func1\#105
;traced to main\func1\#105+4
;traced to main\func1\#105+8←func1()の中の、main.c 先頭から 105 行目を実行
;%SYSTEMG-E-SEM, write protection error←書き込み禁止エラーが発生
; `MEM::00000000'←アクセスしたアドレスは、0x00000000
;%SYSTEMG-I-PROCESS, process "WinAMS" was exited with [0]←異常を検知して終了
;%SYSTEMG-I-PROCESS, process "WinAMS" is terminated
;
;End Log: Tue 18-Dec-2012 15:57:03
;
上記のログのソースコードのサンプルは、下記のとおりです。105 行目にある「*ptr = 10;」を実行し
た時点で、書き込み禁止エラーが発生し、アドレスが 00000000 を指していますので、NULL ポイン
タに書き込みを行ったことが推測できます。
452_01 : シミュレータを起動時に Invalid Operation code found [code = 16] (pc=********)のエ
ラーが表示され動作が止まります。

【質問】
カバレッジマスターでテスト実行のためにシミュレータ起動ボタンを押すと、シミュレータ(System-G)
のアウトプットウインドウに「Invalid Operation code found [code = 16] (pc=********)」が表示さ
れ、動作が止まります。この原因は何でしょうか?

【回答】
Invalid Operation code found のメッセージは、動作中のマイコンシミュレータが解釈できない命令
コードがフェッチされた場合に表示されます。
このエラーが発生する原因は様々で、以下の様な場合が考えられます。
・マイコン種別や型番、エンディアン、ARM コード/thumb コード等マイコンモードが正しく選択されて
いない
・テストに入ってから発生する場合であれば、対象のプログラムが暴走してしまっている
(暴走の原因は様々で、スタックオーバーフロー、NULL アクセス、テストデータ設定ミス等がありま
す。)
マイコン型番の選択は、「ファイル」メニュー→「プロジェクトの基本設定を変更」で確認できます。ま
た、マイコンの種類や型番によっては、「起動設定」ビューの「シミュレータ起動オプション」への指定
が必要なものもあります。
対応方法としましては、このエラーが発生するまでの経過をトレースして、発生原因を探るしかあり
ません。弊社サポート窓口にお問い合せ頂く際には、以下の方法でログを収集して下さい。
[実行ログの収集方法]
1)「起動設定」ビューにて「スタートアップコマンドファイル」の「編集」ボタンでファイルを開きます
2)スタートアップコマンドファイルの最後に、以下の記述を加えて保存します
set verify ; マクロコマンドの実行状態をシミュレータのコマンドウインドウに出力する
set trace/subroutine=yes ; 全ての命令実行をログに出力する
3)テスト CSV を選択し、「シミュレータ起動」ボタンで、エラーが発生するまでテスト実行します
※上記のコマンドを追加した場合、テスト実行にかかる時間は、2 桁程度遅くなりますのでご了承
下さい。
4)プロジェクトのカレントディレクトリに、ログファイル「systemg.log」が生成されます。
※このファイルに、エラーが発生するまでに実行されたアドレス等の情報が記録されています。
このファイルをサポート宛に送付して下さい。
より詳しい参考情報ございます。ご参照下さい。↓
[FAQ] 000_01:シミュレータがエラーで止まってしまいます。エラーの原因を調査するために、動作状
態をログに出力して確認する方法はありませんか?
A01_01 : 「 シ ュ ミ レ ー タ 起 動 」 時 に 、 %SIMULATOR_ERROR: [GUIIFdll_LOAD_MODULE]
ErrorNo:0x81f0009e のエラーが出力され、実行できません。

【質問】
「シュミレータ起動」ボタンを押してテスト実行を行ったところ、
%SIMULATOR_ERROR: [GUIIFdll_LOAD_MODULE] ErrorNo:0x81f0009e
のエラーが出力され、実行できません。何が原因でしょうか?

【回答】
表示のエラーメッセージは、指定しているマイコン(MPU)の使用ライセンスが無い場合に表示され
ます。マイコンの使用ライセンスは、ノードロックライセンスの場合には PC に挿入している USB キー、
フローティングライセンスの場合にはサーバーに挿入している USB キーに書き込まれています。マイコ
ンの使用ライセンスはマイコンシリーズ毎に個別に販売されています。ご購入のマイコンの種類をご
確認下さい。不明な場合には、ユーザーID を添えて、サポート窓口までお問い合わせください。
009_01 :「[関数名]はプログラム解析情報がないため、C1 カバレッジを取得できません」のエラーが
SSTManager に表示されます。

【質問】
「[関数名]はプログラム解析情報がないため、C1 カバレッジを取得できません」のエラーが
SSTManager に表示されます。どのように対処すればよいですか?

【回答】
C1 カバレッジは分岐を観点としたカバレッジであるため、計測するためには、CasePlayer2 でソース
コードの解析を行い、分岐に関する情報を収集する必要があります。このメッセージは、C1 カバレ
ッジを計測するための情報が与えられていない場合ことを示し、対象関数にデバッグ情報が無い
場合、または対象関数が CasePlayer2 で解析出来ていない場合(ソースが存在しない場合やマ
クロ)に表示されます。この関数がテスト対象関数でない場合であれば、そのままでもテスト結果に
は影響しません。
この関数がテスト対象関数、C1 カバレッジ計測が必要な場合は、該当関数がオブジェクトコード
にデバッグ情報付で含まれていることと、CasePlayer2 に該当関数のソースを登録して、解析(全
仕様書生成)が行われていることが必要です。
452_01 :シミュレータを起動時に Invalid address found [code = 18] (pc=********)のエラーが表
示され動作が止まります。

【質問】
カバレッジマスターでテスト実行のためにシミュレータ起動ボタンを押すと、シミュレータ(System-G)
のアウトプットウインドウに「Invalid address found [code = 18] (pc=********)」が表示され、動
作が止まります。この原因は何でしょうか?

【回答】
Invalid address found のメッセージは、ワード/ロングワード単位でメモリをアクセスするとき、ワード/
ロングワード境界整合の取れていないアドレスを指定すると発生します。例えば、2 バイトアラインメ
ントのメモリ構造を持つマイコンの場合、2 バイトワードをポインタでアクセスする場合に、アドレス値
が奇数になっている(アラインメント境界を跨いで 2 バイトアクセスしてしまう)場合に発生します。
このエラーは、他の異常動作が原因となり結果的に奇数アドレスでメモリアクセスしてしまう様な場
合があるため、ソースコードにワード/ロングワード境界整合の取れていないアクセスがあるとは限りま
せん。
また、Invalid address found のメッセージは、アクセスしたメモリ領域がアクセス可能な属性でない
場合に発生することがあります。この場合は、スタートアップコマンドファイルに、assign コマンドを記
述して、該当メモリの属性をアクセス可能に設定して下さい。
(例) assign/read/write 0x00010000:0x0001ffff
517_01 : 「テストデータ毎に時間測定する」のオプションでの実行時間計測は実際のマイコン動作
時間と同じですか?

【質問】
「テストデータ毎に時間測定する」のオプションでの実行時間計測は実際のマイコン動作時間と同
じですか?

【回答】
いいえ、同じではありません。テスト結果 CSV ファイルに出力される実行時間は、マイコンコードの
実行サイクル数(各マイコン命令毎の所要クロック数)の累積で算出されています。実際のマイコン
には、例えばメモリへのアクセスに要する時間など、ハードウエアに依存する時間が存在しますが、
カバレッジマスターの計測時間にはこれらのハードウエア要素の時間は含まれません。また、マイコン
によってはパイプライン処理が行われる場合もあり、命令コードが並行処理されるため、計測された
時間よりも実際の実行時間が短い場合もあります。そのため、この計測時間は、テストデータ毎の
処理時間比較(最長パスの検出など)に使用するなど、用途は限定されます。
529_01 : 複数の関数を結合して 1 つの関数とみなした結合テストを実施することはできますか?

【質問】
カバレッジマスターで、複数の関数を結合して 1 つの関数とみなした結合テストを実施することはで
きますか?

【回答】
はい、可能です。カバレッジマスターはマイコンシミュレータを動作環境に使用しており、実際のマイ
コンと同じ動作を行います。そのためテスト対象関数に呼び出し関数(サブ関数)がある場合は、
その関数をそのまま実行します。テスト対象関数の他に、呼び出し関数のカバレッジを関数単位に
計測することも可能です。実行された呼び出し関数は、「カバレッジ」ビューの「その他の関数」に表
示されます。
007-01 : カバレッジマスターの複数のプロジェクトを一斉テストすることはできますか?

【質問】
カバレッジマスターの複数のプロジェクトをバッチファイル処理で自動実行することは可能でしょうか?

【回答】
カバレッジマスターのプロジェクトファイルは、コマンドラインから起動することができます。
例)プロジェクトファイル project.amsy を起動して、設定されたテストを実行する場合
> c:\winAMS\bin\sstmanager -b project.amsy
オプションの指定により、
・テスト設定画面に表示されているテスト CSV ファイルをすべて実行
・テストCSVファイルを指定してバッチ実行
・結果フォルダを新規作成してバッチ実行
・バッチ実行時のエラーログを保存
が可能です。
書式などの詳細につきましては、カバレッジマスターwinAMS に添付の「winAMS ヘルプ」に「バッチ
実行」として記載されています。下記の手順で参照可能です。
・「Windows スタートメニュー」→「すべてのプログラム」→「winAMS」→「winAMS ヘルプ」を開く
・「検索」タブで「バッチ実行」を検索する
・検索結果から、タイトル「バッチ実行」のページを開く
114-01 : ライブラリ(*.lib など)やコンパイラが生成する中間オブジェクト(*.obj など)を指定してテ
ストを行うことはできますか?

【質問】
カバレッジマスターwinAMS に与えるオブジェクトファイルは、ライブラリ(*.lib など)やコンパイラが生成
する中間オブジェクト(*.obj など)を指定してテストを行うことができますか?

【回答】
いいえ、カバレッジマスターはマイコンシミュレータを動作環境として使用しており、実マイコンと等価
な動作をします。このため、カバレッジマスターwinAMS で実行を行うためには、コンパイル、リンクを
行い、実行可能なオブジェクトファイル(デバッグ情報付)を作成する必要があります。
ライブラリ(*.lib など)やコンパイラが生成する中間オブジェクト(*.obj など)を直接指定してテストを
行うことはできません。
カバレッジ計測に関する問題
013_02 : MC/DC 計測を行うために必要なセットアップ、環境の作成について教えて下さい。

【質問】
MC/DC のカバレッジ計測を行いたいと思います。このために必要な環境のセットアップや、設定に
ついて教えて下さい。

【回答】
MC/DC の網羅率を計測するためには、MC/DC オプションの追加購入が必要です。ご購入に関
する詳細は、弊社営業部までお問い合わせください。

また、MC/DC の計測環境の作成に付きましては、以下の参考情報をご参照下さい。
■カバレッジマスターwinAMS チュートリアル 【応用編】MC/DC カバレッジ計測 (P.63)
■カバレッジマスターwinAMS 入門セミナーテキスト (P.136 )
013_04 : 「埋め込みコード」によるカバレッジ計測を行うために必要なセットアップ、環境の作成に
ついて教えて下さい。

【質問】
C0、C1 のカバレッジを計測していますが、コンパイラの最適化の影響のため、C コードにアセンブラ
命令が展開されない場合が有り、想定するカバレッジ計測結果になりません。この問題を回避す
るために、アセンブラコードの影響を受けない「埋め込みコード」によるカバレッジ計測を行いたいの
ですが、必要な環境のセットアップや、設定について教えて下さい。
参考 FAQ:
■102_01 : 全ての分岐が実行可能なデータを与えているにも関わらず、C1 カバレッジ結果が
100%になりません。
■102_04 : カバレッジ計測結果を見ると、C1(分岐カバレッジ)が 100%であるにも関わらず、C0
(命令カバレッジ)が 100%になりません。

【回答】
「埋め込みコード」によるカバレッジ計測を行うためには、MC/DC 計測を行う場合と同様の測定環
境を作成することが必要です。下記のリンクの資料を参考にしてください。記載内容は MC/DC に
ついて記載していますが、環境の作成方法、「埋め込みコード」の作成方法は同じです。
また、MC/DC の測定はオプション機能のためオプションライセンスの購入が必要ですが、「埋め込み
コード」による C0、C1 カバレッジ計測は標準機能のため、オプションライセンスは必要有りません。

■カバレッジマスターwinAMS チュートリアル
【応用編】MC/DC カバレッジ計測 (P.63)
【参考】コンパイラ最適化の影響を受けずに C0、C1 カバレッジを計測する(P.74)

■カバレッジマスターwinAMS 入門セミナーテキスト (P.136 )
013_05 :カバレッジ計測に 「埋め込みコード」を適用したいのですが、オブジェクトサイズが大きくな
りマイコンの ROM 容量を超えてしまいます。どのようにすれば良いですか?

【質問】
MC/DC、C0、C1 のカバレッジ計測に、オブジェクト構造の影響を受けない「埋め込みコード」の機
能を使用したいのですが、埋め込みを行ったコードをコンパイルしたところ、オブジェクトサイズが大き
くなりマイコンの ROM 容量を超えてしまいます。どのようにすれば良いですか?

【回答】
回避方法には以下の通りです。
1)埋め込みコードの適用範囲を制限する
埋め込みを行うコードは、ソースファイル単位に選択できます。テスト対象の関数が含まれるソース
ファイルのみに埋め込みを行う事で、オブジェクトコードサイズの増加を回避することができます。
CasePlyer2 → [プロジェクトメニュー] → [埋め込みコードビルド環境生成]にて、「埋め込みコー
ドの設定」タブで、テスト対象の関数があるソースのみを選択してください。(下図参照)
2)圧縮埋め込み の機能を使用する
また、V3.6 以降のバージョンには、埋め込みコードのサイズを小さくするオプション「圧縮埋め込みコ
ード(フックコード)を使用する」が利用できます。マイコンやコンパイラにより縮小できるサイズは異な
りますが、このオプションを ON にすることで、埋め込みコードの冗長性を抑えて、生成オブジェクトコ
ードを小さくします。
3)使用しているマイコンと同じシリーズの別型番で、ROM 容量の大きい型番でコンパイルする
同じシリーズのマイコンで、実際のマイコンよりも ROM 容量の大きなマイコンが有る場合であれば、
埋め込みコードのコンパイル環境のみ、ROM 容量の大きな型番を指定して、埋め込みコードのオ
ブジェクトを生成する回避方法があります。
埋め込みコードからの計測の仕組みは、マイコンのオブジェクト構造には依存せず、埋め込んだフッ
ク関数の機能により計測されます。このため、実際のマイコンと異なる型番で実行した場合でも、
そのコードが実行可能であれば、MC/DC テスト結果には影響を与えません。
実コード(製品実装と同じ)のコンパイル環境はそのままにして、埋め込みコードのコンパイル環境の
みに上記の ROM 容量の大きい型番を選択してオブジェクトを生成してください。関数実行後の出
力変数の値の評価は、埋め込みコード側ではなく、並行して動作する実コードの方から取得され
ますので、カバレッジ計測以外の単体テスト結果には影響はありません。
4)上記の回避方法を使用しても ROM 容量を超えてしまう場合は、オブジェクトを調整
1つのソースファイルを埋め込み対象にしただけでも、オブジェクトコードの ROM 容量をオーバーして
しまう場合は、テストに関係しないオブジェクトをリンクから外すなどの方法で、テスト実行に影響し
ない範囲でオブジェクトを小さくするしか、回避方法はございません。

(参考)入門セミナー資料からの抜粋:(参考)埋め込みコードによるコードサイズ増加
(PDF ファイル)
013_03 : MC/DC 計測のオブジェクトをビルドする際、コンパイラの最適化を OFF にすることが推奨
されていますが、なぜですか?

【質問】
MC/DC 計測のオブジェクトをビルドする際、コンパイラの最適化を OFF にすることが推奨されてい
ますが、最適化を OFF にすると製品へ実装するオブジェクトコードと異なったコードになってしまいま
す。どのように考えればよいのですか?

【回答】
MC/DC 計測時には、実オブジェクトコードと、MC/DC 計測用に埋め込みを行ったオブジェクトコー
ドの両方を実行し、前者の実コードから期待判定の出力値と C0 カバレッジ、後者の埋め込みオ
ブジェクトから MC/DC、C1 カバレッジを取得する仕組みとなっています。
前者の実コードには、テスト品質を保つために、製品に実装するコードと同じ最適化を適用したオ
ブジェクトを使用して問題ありませんが、後者の埋め込みの行われたコードのみ、最適化を OFF に
してコンパイルして頂くことを推奨しています。
後者の埋め込みが行われたコードは、テスト対象のソースコードにタグ(フック)コードを追加している
ため、この時点で実際の製品へ実装するコードとは異なった構造となっており、これに最適化を行
ってオブジェクトを生成すること自体に意味がありません。
埋め込みコードは MC/DC を正しく計測することが目的であるため、このコードは最適化の影響を
受けないようにして頂くことが推奨されています。
出力結果を判定する部分につきましては、上記の様に最適化を適用した製品と同じオブジェクト
で実行されるため、テストの品質は最大限に保たれています。
機能安全への対応につきましても、この方式での MC/DC 計測で、機能安全ツール認証を取得し
ています。
MC/DC 計測の仕組みにつきましては、下のリンクを参考にご覧ください。

【参考資料】
MC/DC 計測の仕組みについて(カバレッジマスタープレゼン資料からの抜粋)
013_01 : MC/DC テストデータを作成する機能でデータを生成しましたが、MC/DC 網羅率の計測
結果が表示されません。

【質問】
MC/DC テストデータを作成する機能がサポートされていますが、これを使用して作成したデータを
カバレッジマスターで実行したところ、実行結果に MC/DC の網羅率が表示されません。表示する
には、オプション設定か何か特別な処理が必要なのでしょうか?

【回答】
MC/DC テストデータを作成する機能は標準機能としてサポートされていますが、MC/DC の網羅
率を計測するためには、MC/DC オプションの追加購入が必要です。ご購入に関する詳細は、弊
社営業部までお問い合わせください。

また、MC/DC の計測環境の作成に付きましては、以下の参考情報をご参照下さい。
■カバレッジマスターwinAMS チュートリアル 【応用編】MC/DC カバレッジ計測 (P.63)
■カバレッジマスターwinAMS 入門セミナーテキスト (P.136 )
102_01 : 全ての分岐が実行可能なデータを与えているにも関わらず、C1 カバレッジ結果が 100%
になりません。

【質問】
カバレッジマスターwinAMS を使用して分岐を持つ関数の単体テストを行いましたが、全ての分岐
が実行可能な入力データを与えているにも関わらず、C1 カバレッジ結果が 100%になりません。な
ぜでしょうか?

【回答】
カバレッジマスターwinAMS は、マイコンシミュレータを使用して実際のアセンブラコードを実行します。
カバレッジ計測は、実行されたアセンブラコードに対応する C ソースをマーキングする方法でカバレッ
ジを計測しています。C1 カバレッジ計測は、コンパイラが生成したアセンブラコードを実行した結果
から、分岐が実行されたかの判断を行っています。
このため、例えば、if 文の分岐に対してコンパイラが分岐構造を生成しない(分岐命令を使用しな
い展開を作成する)場合や、コンパイラの最適化により、本来の C ソースと異なる構造のコードを
生成する場合もあります。このような場合に、C ソースの上では C1 カバレッジが計測不能となった
り、実行されないソース行が発生したりする場合があります。
詳細につきましては、カバレッジマスターwinAMS に添付の「winAMS ヘルプ」に「制限事項」として
記載されています。下記の手順で参照可能です。
・「Windows スタートメニュー」→「すべてのプログラム」→「winAMS」→「winAMS ヘルプ」を開く
・「検索」タブで「制限事項」を検索する
・検索結果から、タイトル「制限事項」のページを開く
ページ中の「C1 カバレッジの制限」に詳細が記載されています。
<回避方法:埋め込みコードによるカバレッジ測定>
また、この問題を回避する方法として、「埋め込みコード」による C0、C1 カバレッジ計測の機能があ
ります。これは、「埋め込みコード」と呼ばれるカバレッジ測定のためのコードをテスト対象のソースコ
ードに挿入し、アセンブラコード展開の影響を受けないカバレッジ測定専用のオブジェクトコードを
使用して C0、C1 カバレッジを計測する方法です。(MC/DC カバレッジを計測する機能と同様で
す。)
詳細につきましては、以下の FAQ を参照してください。
■013_04 : 「埋め込みコード」によるカバレッジ計測を行うために必要なセットアップ、環境の作成
について教えて下さい。
102_02 : カバレッジマスターのカバレッジ計測において、C0、C1、MC/DC の網羅率はどのように計
算されますか?

【質問】
カバレッジマスターwinAMS のカバレッジが計測では、C0、C1、MC/DC の網羅率の%値はどのよう
に算出されているのですか?

【回答】
各々のカバレッジ網羅率は、下記の方法で算出されています。
C0:実行できた行数/実行対象行数 × 100(%)
C1:遷移数/C1 対象の条件分岐における分岐数の合計 × 100(%)
MC/DC:MC/DC の基準を満たす比較式の数/全比較式の数 × 100(%)
各々の網羅率の算出方法の詳細は、カバレッジマスターwinAMS に添付の「winAMS ヘルプ」に記
載されています。下記の手順で参照可能です。
・「Windows スタートメニュー」→「すべてのプログラム」→「winAMS」→「winAMS ヘルプ」を開く
・「検索」タブで「網羅率の計算方法」を検索する
・検索結果から、タイトル「網羅率の計算方法」のページを開く
MD/DC の計測方法の詳細につきましては、インストールされているヘルプファイルをご覧ください。
↓
■[Windows スタート]→[すべてのプログラム]→[WinAMS]→[ガイオのテストツールにおける MC/
DC の測定方法]
102_03 : 三項演算子を使用して記述されたコードは、条件分岐として C1 カバレッジ計測ができ
ますか?

【質問】
「((x >= y)? x : y)」の様に三項演算子を使用して記述されたコードは、条件分岐と認識して C1 カ
バレッジ計測ができますか?

【回答】
カバレッジマスターでは、三項演算子は1つの実行文として扱われ、条件分岐と見なされず、C1 カ
バレッジ計測の対象となりません。三項演算子以外でも、例えば「if (a == b) { x++; }」分岐元と分
岐先が同じ行に記述されている場合も、C1 カバレッジ計測の対象となりません。
これらの C1 カバレッジ計測に関する詳細につきましては、カバレッジマスターwinAMS に添付の
「winAMS ヘルプ」に「制限事項」として記載されています。下記の手順で参照可能です。
・「Windows スタートメニュー」→「すべてのプログラム」→「winAMS」→「winAMS ヘルプ」を開く
・「検索」タブで「制限事項」を検索する
・検索結果から、タイトル「制限事項」のページを開く
ページ中の「C1 カバレッジの制限」に詳細が記載されています。
102_04 : カバレッジ計測結果を見ると、C1(分岐カバレッジ)が 100%であるにも関わらず、C0(命
令カバレッジ)が 100%になりません。

【質問】
カバレッジマスターで関数の単体テストを行いましたが、カバレッジ計測結果を見ると、C1(分岐カ
バレッジ)が 100%であるにも関わらず、C0(命令カバレッジ)が 100%になりません。全ての分岐が実
行されて C1 が 100%であれば、すべてのソース行が実行されているはずなのですが、なぜ、このよう
な結果となるのでしょうか?

【回答】
1つの原因としては、return 命令や goto 命令などがコードにある場合、C ソースのロジックで実行
されることのないコード(デッドコード)が存在する場合にこのような結果となります。これは、カバレッ
ジビューで該当行を確認することができます。
もう1つの原因として、コンパイラの生成するコード構造に依存する場合があります。一例では、関
数の最終行('}'の行)が実行されない結果が出力される場合があります。これは、実行コードでな
い定数領域をコンパイラが最終行に生成し、デバッグ情報にこの対応付け(最終行に定数領域の
コードを対応付けしてしまう)を行っている場合です。
テスト実行時には、実行コードでない定数領域は実行されないため、カバレッジマスターは最終行
が実行されていないと判断し、C0 カバレッジが 100%とならない結果を出力します。
このような結果については、カバレッジビューの「逆アセンブルコード展開」の機能を使用して、実行
されない行のコードを評価頂く必要があります。
<回避方法:関数の最終行に実行できないコードが生成される場合>
関数の最終行をカバレジ計測の対象から除外するオプションが用意されています。このオプションは、
「テスト設定」ビューの「カバレッジ」の項目にある「詳細設定」のボタンで表示される設定画面にあ
ります。
□関数終了コードを C0 カバレッジの対象外にする
<回避方法:埋め込みコードによるカバレッジ測定>
この問題を完全に回避する方法として、「埋め込みコード」による C0、C1 カバレッジ計測の機能が
あります。これは、「埋め込みコード」と呼ばれるカバレッジ測定のためのコードをテスト対象のソース
コードに挿入し、アセンブラコード展開の影響を受けないカバレッジ測定専用のオブジェクトコードを
使用して C0、C1 カバレッジを計測する方法です。(MC/DC カバレッジを計測する機能と同様で
す。)

詳細につきましては、以下の FAQ を参照してください。
■013_04 : 「埋め込みコード」によるカバレッジ計測を行うために必要なセットアップ、環境の作成
について教えて下さい。
102_05 : テストデータ CSV に期待値を入力していないにもかかわらず、テスト実行結果が「OK」と
表示されてしまいます。

【質問】
入力データの CSV ファイルには、入力変数のテストデータのみを設定し、出力変数のデータ(期待
値)は空欄にしてテスト実行しましたが、期待値を入力していないにもかかわらず、テスト実行結
果が「OK」と表示されてしまいます。これはなぜでしょうか?

【回答】
テスト結果 CSV ファイルのテストデータ毎の判定結果では、期待値を入力していないテストデータ
は「NO Check」と評価結果を出力します。
ただし、CSV ファイル全体の判定結果(関数のテスト結果)は、「テスト設定」ビューの「その他の設
定 / NG でなければ OK にする」のオプションで、以下の様に出力結果を選択できるようになってい
ます。
「□NG でなければ OK にする」 が ON の場合:期待値判定を行わなかった場合の「NO Check」を
「OK」として扱います。テスト結果の中に1つでも「NG」があれば総合判定は「NG」となり、全てのテ
スト結果が「OK」もしくは「NO Check」であれば総合判定は「OK」となります。このオプションは、全て
のテストデータに期待値を設定せず、必要なテストデータのみの期待値評価を行う場合を想定し
ています。
「□NG でなければ OK にする」 が OFF の場合:テスト結果の中に1つでも「NG」があれば総合判
定は「NG」となり、全ての結果が「NO Check」の場合は総合判定は「NO Check」と表示します。こ
れ以外の場合(全てのテスト結果が「OK」もしくは「NO Check」の場合)は総合判定は「OK」となり
ます。
ご質問の現象は、前者のオプション(「□NG でなければ OK にする」を ON)の動作に該当します。
102_06 : 「プログラム解析情報がないため、C1 カバレッジ情報は出力できません」のメッセージが
出力され、C1 カバレッジが 0%となってしまいます。

【質問】
CasePlayer2 と連携して C1 カバレッジ計測を行おうとしていますが、関数を選択してテスト実行を
行うと、SSTManager のアウトプットウインドウに「プログラム解析情報がないため、C1 カバレッジ情
報は出力できません」のメッセージが出力され、C1 カバレッジが 0%となってしまいます。どうすれば
C1 カバレッジが計測できますか?

【回答】
C1 カバレッジ計測を行うためには、CasePlayer2 が生成する“プログラム解析情報”が必要です。
テスト対象の関数のプログラム解析情報が生成されていない場合に、このメッセージが出力されま
す。原因としては、以下の理由が考えられます。
・テスト対象関数を含むソースファイルが CasePlayer2 のプロジェクトに登録されていない
・CasePlayer2 の「設定」タブの「仕様書生成」の設定項目で、「winAMS 用プログラム解析情報を
生成する」のオプションが OFF になっている
・テスト対象関数がヘッダファイル(*.h)に記述されている(機能制限により、ヘッダファイルに記述さ
れた関数は、CasePlayer2 では解析できません。)
・CasePlayer2 でのソースコード解析中に、エラーが発生している
102_07 : カバレッジビューのソース表示で、C0,C1 のカバレッジ判定とソース行の位置がズレて表示
されます。

【質問】
カバレッジビューのソース表示で、分岐でない行に C1 カバレッジ結果が表示されたり、C1 カバレッ
ジ結果(T/F、4/4 など)が表示されなかったりします。ソース行の位置がズレて表示されているよう
にも見えるのですが、これはなぜでしょうか?

【回答】
これは、テスト対象のオブジェクトコードのデバッグ情報から参照されるソースファイルが、オブジェクト
コードを生成した(コンパイルした)時点から変更されている(同じソースでない)場合に起こります。
また、CasePlayer2 の解析情報が、テスト対象のオブジェクトコードのデバッグ情報から参照される
ソースファイルと合わない場合も該当します。
この場合は、以下の作業を行ってから、テスト実行を行う必要があります。
・ソースコードを再ビルドして、オブジェクトコードを最新状態にする
・CasePlayer2 の「全仕様書生成」を実行して、解析情報を最新状態にする
カバレッジマスター「ゼネラル」固有の問題
A02_02 :カバレッジマスターゼネラルでテストを行うために、最初にどのような手順で設定する必要
がありますか?

【質問】
カバレッジマスターゼネラルを使用してこれからテストを行いたいと思います。どのような手順で環境
を設定すれば良いですか?

【回答】
カバレッジマスターゼネラルは、汎用のマイコンシミュレータを実行環境に使用した単体テストツール
です。「ゼネラル」と言う別のマイコンを使用すると考えて頂くと良いかも知れません。
開発に使用してイル開発環境、コンパイラで生成したオブジェクトコードは使用致しません。テスト
を実行するための汎用マイコン用の実行コードは、連携する CasePlayer2 によってコンパイルされ作
成されます。
■CasePlayer2 を使用してゼネラルの実行コード(*,xlo)を生成するための設定
1)CasePlayer2 でゼネラルのコードを生成するオプションを ON にする
CasePlayer2 のプロジェクトを作成したら、「設定」タブから「仕様書生成」のダイアログを開いてくだ
さい。その中の「詳細解析を行う」のオプションを ON にしてください。さらに、「General コードを生成
する」のオプションを ON にしてください。これにより、CasePlayer2 に登録したソースコードの解析を
行う(プロジェクトメニューから「前仕様書生成」を選択)と、同時にゼネラルの実行コード(プロジェク
ト名.xlo)ファイルが生成されます。
2)ソースコードの解析を行い、解析エラーを除去する
ゼネラルの実行コードを作成すると言うことは、言い換えれば CasePlayer2 内蔵のコンパイラでコン
パイルを行う事を示します。そのため、開発環境に設定しているインクルードパスや、プリプロセッサ
(#define 情報)などを CasePlayer2 にも設定する必要があります。
さ ら に 、 開 発 に 使 用 し て い る ク ロ スコ ン パ イ ラ が持 つ特 有 の 記 述 ( コ ン パイ ラ の 方 言 ) は 、
CasePlayer2 内蔵のコンパイラには解釈できないため、そのままでは解析エラー(未定義エラーなど)
が発生してしまいます。これを回避するために、これらの方言を CasePlayer2 にどのように解釈させ
るかを、「C オプションパラメータ」の機能を使用して設定します。
下の FAQ リンクに、上記の設定の手順が書かれていますので参照してください。
D01-01:詳細解析モードを使用する場合、または、CasePlayer2 でカバレッジマスターとの連携を
行う場合に必要な基本的な設定について教えてください。
これらの設定を行い、解析エラー(コンパイルエラー)がなくなれば、ゼネラル用の実行コード(*.xlo)
が正しく生成されます。

【参考資料】
カバレッジマスターGeneral の設定方法の概要を示した資料です。
・カバレッジマスターゼネラル 概略手順書(PDF)
A02_01 :カバレッジマスターゼネラルで、「ポインタ割当てエリア設定」のアドレスはどのように設定す
れば良いでしょうか?

【質問】
カバレッジマスターゼネラルを使用していますが、ポインタに対して「エリア割当て」のオプションで実体
を自動的に割り付ける機能を使用した場合、「テスト設定」のビューにある「ポインタ割当てエリア
設定」のアドレスはどのように設定すれば良いでしょうか?

【回答】
ゼネラルに内蔵されているテスト実行シミュレータ(汎用マイコンシミュレータ)のメモリマップは以下の
通りです。
00100000H~00110003H スタック
00110004H~00FFFFFFH 空き(カバレッジマスターのポインタ割り当てエリアとして利用可能)
01000000H~03FFFFFFFH 変数領域(デフォルトの sbrk では、ヒープはここ)
040000000H~0FFFFFFFFH プログラム領域
※上記アドレスは9桁で表示されていますが、最後に H を付けた 16 進数表記では、先頭の数字
が 0 以外の場合は、0 を付加して表記しています。このアドレス値で間違いはございません。
「ポインタ割当てエリア設定」のアドレスは、「 00110004H ~ 00FFFFFFH 」の空き領域を使用し
てください。
A02_03 :カバレッジマスターゼネラルに内蔵されている汎用マイコン(General)のデータ型は、どのよ
うな仕様ですか?実際のマイコンとどのような差がありますか?

【質問】
カバレッジマスターゼネラルを使用したいのですが、実際のマイコンとの仕様の差を把握したいと思い
ます。カバレッジマスターゼネラルに内蔵されている汎用マイコン(General)のデータ型は、どのような
仕様ですか?実際のマイコンとどのような差がありますか?

【回答】
カバレッジマスターゼネラルに内蔵されているマイコンシミュレータは、32 ビットの RISC 系のマイコンの
構造を持ちます。マイコンのビット数を変更したり指定することはできません。
また、バイトオーダに関しては、リトルエンディアンまたはビッグエンディアンの選択が可能ですが、それ
以外の処理系依存項目については、変更は出来ません。
そのため、特に 16 ビット、8 ビットなどデータ幅の異なるマイコンのコードをテストする場合、マイコン
構造の違いから来るデータ型の違いを把握しておく必要があります。
「int」型の記述がソースコードに有る場合、その変数のビット幅はマイコンによって異なります。32 ビ
ットマイコンでは int = 32bit(long 型) 、 16 ビットマイコンでは int=16bit(short 型) です。例え
ば、16 ビットのマイコンコードをテストする際には、int 型の変数は、予め 16 ビットを明示する short
型で変数を定義しておく必要があります。
ゼネラルの言語処理(実行コードを生成する際の内蔵コンパイラの仕様)は、ヘルプマニュアルに記
載されています。
Windows スタート → WinAMS → カバレッジマスターGeneral ヘルプの「言語仕様」のページ
(上記マニュアルからの抜粋)
言語仕様
識別子の有効文字数
識別子の有効長: 250 文字(250 文字を超える識別子でもビルドできますが、C++言語の場合、
カバレッジマスター winAMS でその識別子を参照できなくなります。その場合、テストドライバを作
成して、その識別子への値の代入、参照を行ってください)
データタイプ
変数タイ
プ
サ イ
ズ
最小値
最大値
char
unsigned
char
8bit
8bit
-128
0
+127
+255
short
unsigned
16bit
16bit
-32768
0
+32767
+65535
short
short int
unsigned
short int
16bit
16bit
-32768
0
+32767
+65535
int
unsigned
int
long
unsigned
long
32bit
32bit
32bit
32bit
-2147483648
0
-2147483648
0
+2147483647
+4294967295
+2147483647
+4294967295
long long
unsigned
long long
64bit
64bit
9223372036854775808
0
+9223372036854775807
+18446744073709551615
float
double
long
double
32bit
64bit
64bit
-1e37
-1e306
-1e306
+1e37
+1e306
+1e306
1 ~
32bit
-2^(W-1)
0
2^(W-1) - 1
2^(W) - 1
32bit
32bit
--0
--0xffffffff
signed ビ
ットフィー
ルド
unsigned
ビットフィ
ールド
enum
ポインタ
備考 W(width)は指定されたビットの幅を示します
補足:bool は int と同じです。
ビットフィールドは、32 ビット境界でアサインされます
_Bool(C99)は char と同じです。
General を使用した場合、MISRA-C 解析時の int サイズは 32 ビット固定となります。
ビットフィールド
ビットフィールドでは 32bit の境界を越えてフィールドを定義することはできません。
したがって,ビットフィールドのメンバの最大幅は 32bit です。
また,メンバが 32bit 境界を越えるときは次の 32bit 境界に整合されます。
ビットフィールドは定義順に MSB から割り当てられますが、LSB につめて割り当てられるため、空きビ
ットが MSB 側に取られます。
以下の例は 4 つのメンバからなる構造体を定義していますが,この場合メモリ上では下図のように,
割り当てられます。
例
【ビットフィールド定義】
struct bit {
int a:4 ;
int b:5 ;
int c:30 ;
int d:8 ;
};
【ビットフィールド割り当てイメージ】
浮動小数点数
General で使用される浮動小数点数の内部フォーマットは,IEEE754 に準拠しています。
また,General では拡張倍精度(80 ビット)の浮動小数点数はサポートしていません。
アライメント(バウンダリ調整)
【アライメント調整値一覧】
変数の宣言場所
変数の型
アライメント調整値
スタティック記憶クラス
グローバル記憶クラス
char
short
int
long
float
long long
double
ポインタ
構造体・共用体
配列
1
2
4
4
4
4
4
4
4
型に依存
オート記憶クラス,引数
全型
4
構造体のメンバ
char
short
int
long
float
long long
double
ポインタ
構造体・共用体
1
2
4
4
4
4
4
4
4
配列
型に依存
General コード生成では、#pragma pack(n)と GNU の packed 属性および aligned(n)属性を無視
します。このため、sizeof()の計算ではこれらの指定がないものとして計算します。