ホーム > ユーザーサポート > FAQ カバレッジマスターwinAMS
【質問】
引数にvoidポインタを持つ関数をテストしようとしています。渡されたvoid型のポインタ変数は、関数内で他の型にキャストされています。このようなvoid型ポインタ変数をCSVファイルの入出力変数に指定するには、どのようにすれば良いですか?
【回答】
void型のポインタ変数は、CSVファイルの入出力変数に直接指定することはできません(ポインタ変数そのものをアドレス指定でテスト変数にすることはできますが、ポインタが指す先の値をテストCSVから与えることはできません)。下記に記載するダミー関数(ドライバ関数)を用いる方法で対応する事ができます。
<サンプルコード> ■test.h typedef struct _TEST_ST { signed char a; signed int b; } TEST_ST; ■test.c #include "test.h" int test(void *pv) { TEST_ST *pst = (TEST_ST *)pv; if (pst->a < 0) { return -1; } else { return pst->b; } }
上記例で構造体「TEST_ST」のメンバ「a」「b」をテスト変数にするには、ダミー関数を用いたテストを実施します。ダミー関数を用いたテストについては、下記Q&Aも参照ください。
具体的にはまず下記のようにダミー関数を新規作成し、ビルド対象に加えてオブジェクトファイルを再作成し、OMF変換を再実行します。「★」のように、テスト対象関数内でvoidポインタをキャストしているのと同じ型のグローバル変数を作成します。
<ダミー関数(ドライバ関数)> ■dummy.c #include "test.h" extern int test(void*); TEST_ST test_st; // ★ int dummy_for_test(void) { return test((void *)&test_st); }
次に「dummy_for_test()」をテスト対象関数としてモジュールテスト用テストCSVを作成します。このとき下図のように「テストドライバを使ったテスト」のチェックをONにし、「カバレッジ測定対象関数」に本来のテスト対象関数「test()」を設定します。
これで「test_st.a」「test_st.b」をテスト変数にすることができます。たとえば
というテストCSVを用いてテスト実行すると
のようにtest()のカバレッジ測定結果が得られます。