よくある質問(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」を付加します。