2

単体テストでは、関数を「外部」から置き換えたいと思います。通常、私はラッピング メカニズムを使用していますが、残念ながら、これは同じコンパイル ユニット内からの関数呼び出しでは機能しません。

私の考えは、関数を「弱い」とマークして、テストアプリケーションで再実装できるようにすることでした。通常、これは次のコードを使用して機能します。

ファイル 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 ビルド) を使用しています。

助けてくれてありがとう!フロリアン

4

0 に答える 0