Как указано в ответе на этот вопрос , компилятор (в данном случае 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
, то это недопустимый вызов, потому что source и dest перекрываются.
Очевидно, что если я заменю оператор присваивания в frob
на вызов memmove
, то проблема исчезнет.
Но это ошибка компилятора или этот оператор присваивания каким-то образом недопустим?