よくある質問(FAQ)

スタブ関数が認識されません、「関数シンボルが存在しません」エラーが発生します。

スタブ関数について

質問

「スタブ設定」の機能でスタブ関数を作成し、スタブのソースファイルを開発環境でビルド、リンクしましたが、シミュレータでテスト実行中にエラーとなってしまいます。(※関数、変数シンボルが存在しない等のエラーが発生)考えられる原因を教えてください。

回答

コンパイル・リンクを行った「スタブ関数」が実行オブジェクトファイルにスタブ関数が含まれていないことが想定されます。以下の原因が考えられます。

■ スタブソースファイルの先頭にある「#ifdef WINAMS_STUB」が無効になっている

カバレッジマスターwinAMSで生成されたスタブソースファイルの先頭には、ソース全体を囲むプリプロセッサ命令 「#ifdef WINAMS_STUB」が記述されています。そのため、開発環境(コンパイラ)のプリプロセッサ設定で「WINAMS_STUB」が定義されていない場合、スタブソースファイルの実体がすべて無効化され、実質的にコンパイルの対象になりません。スタブ関数を正しくオブジェクトファイルに含めるために、ビルドオプション(コンパイルオプション)にて、マクロ定義(例:-DWINAMS_STUB)を必ず設定してください。

■ 開発環境のリンカの最適化でスタブ関数がリンクから外されている

カバレッジマスターで生成したスタブ関数は、元のアプリケーションコードから直接呼び出されない孤立した関数となります。そのため、コンパイラやリンカの最適化機能によって「未使用関数」と判定され、オブジェクトファイルから削除されてしまうことがあります。この現象が発生する場合は、スタブ関数を強制的にリンク対象に含めるためのダミーコードが必要です。

コンパイラやリンカの仕様に依存しますが、一般的には、スタブ関数の関数ポインタ配列を volatile 宣言を用いてグローバル領域に定義しておくことで、削除を回避しリンク対象に含めることができます。例えば、スタブ関数として AMSTB_func1、AMSTB_func2、AMSTB_func3 がある場合は、スタブソースファイルの末尾に、

volatile int (*dummyfunc[])() = { AMSTB_func1, AMSTB_func2, AMSTB_func3 };
を追加することで対応可能です。
IAR社製のコンパイラをご利用の場合は、コンパイラ固有の拡張キーワードである「__root」を関数定義に付与することで、呼び出しがなくてもコードを強制的に保持できる可能性があります。具体的には

__root int AMSTB_func1(int arg0)
{  ...
}

のように、スタブ関数の先頭に「__root」を付加します。