この質問への回答で指摘されているように、コンパイラ (この場合は gcc-4.1.2、はい、古い、いいえ、変更できません) は、適切と思われる場所で構造体の割り当てを memcpy に置き換えることができます。
valgrind でいくつかのコードを実行していますが、memcpy のソース/宛先の重複に関する警告が表示されました。コードを見ると、次のように表示されます (言い換え):
struct outer
{
struct inner i;
// lots of other stuff
};
struct inner
{
int x;
// lots of other stuff
};
void frob(struct inner* i, struct outer* o)
{
o->i = *i;
}
int main()
{
struct outer o;
// assign a bunch of fields in o->i...
frob(&o.i, o);
return 0;
}
gcc がその割り当てを に置き換えることを決定した場合memcpy
、ソースと宛先が重複するため、無効な呼び出しになります。
明らかに、割り当てステートメントfrob
を callに変更するとmemmove
、問題はなくなります。
しかし、これはコンパイラのバグですか、それともその代入ステートメントは何らかの理由で無効ですか?