単体テストでは、関数を「外部」から置き換えたいと思います。通常、私はラッピング メカニズムを使用していますが、残念ながら、これは同じコンパイル ユニット内からの関数呼び出しでは機能しません。
私の考えは、関数を「弱い」とマークして、テストアプリケーションで再実装できるようにすることでした。通常、これは次のコードを使用して機能します。
ファイル myfunctions.c (これはテスト対象のコードです):
#include "myfunctions.h"
int weakFunction(int param) __attribute__((weak));
int weakFunction(int param)
{
return 2*param;
}
int myfunction(int param)
{
int result = weakFunction(param);
return (result == (2*param)) ? 1:0;
}
ファイル main.c
#include "myfunctions.h"
int weakFunction(int param)
{
return 3*param;
}
int main()
{
return myfunction(5);
}
この例は期待どおりに動作しweakFunction
ます。main.c から削除するとプログラムは 1 を返し、追加weakFunction
するとプログラムは 0 を返します。この時点では問題ないようです。
しかし、次のように myfunctions.c 内の順序を変更するとすぐに、結果のプログラムがセグメンテーション違反でクラッシュします。
ファイル myfunctions.c (変更された順序):
#include "myfunctions.h"
int weakFunction(int param) __attribute__((weak));
int myfunction(int param)
{
int result = weakFunction(param);
return (result == (2*param)) ? 1:0;
}
int weakFunction(int param)
{
return 2*param;
}
何か案が?クラッシュの原因は何ですか?
Windows 7 で GCC 4.8.1 (MinGW w64 ビルド) を使用しています。
助けてくれてありがとう!フロリアン