3

編集: 問題の解決策は、プロトタイプの欠落でした。

呼び出しuint8_t foo(uint16_t bar)てその戻り値を a に割り当てるとuint32_t temp、LSB だけでなく、tempそれ以上の値が上書きされます。これはどのように可能ですか?コンパイラはGCCです。

呼び出しコード:

uint32_t temp = 0xAAAAAAAA;
printf("[%x]\n", temp);
temp = foo(me->bar);
printf("[%x]\n", temp);

出力:

[aaaaaaaa]
[4081ff]

ここでは、foo の実装の関連部分を示します。

typedef struct CMOCK_foo_CALL_INSTANCE_tag
{
  UNITY_LINE_TYPE LineNumber;
  uint8_t ReturnVal;
  int CallOrder;
  uint16_t Expected_nGoNo;
} CMOCK_foo_CALL_INSTANCE;

uint8_t foo(uint16_t bar)
{
  CMOCK_foo_CALL_INSTANCE* cmock_call_instance =
    (CMOCK_foo_CALL_INSTANCE*)CMock_Guts_GetAddressFor(Mock.foo_CallInstance);
  (...)
  return cmock_call_instance->ReturnVal;
}
4

1 に答える 1

4

呼び出すファイルに、関数が呼び出される前に、ディレクティブを介して、またはファイルの前にプロトタイプ/定義を追加してtemp = foo(me -> bar);、関数のプロトタイプまたは完全な定義が含まれていることを確認してください。uint8_t foo(uint16_t bar);#include

関数のシグネチャが既に確認されていない場合、コンパイラはシグネチャを想定し、int foo();それに応じてコードを生成します。

を使用gcc -W -Wallしてコンパイルすると、暗黙的な関数シグネチャの仮定が行われたときに警告が生成されます。

于 2013-06-05T19:21:38.987 に答える