This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/32667] New: builtin operator= generates memcpy with overlapping memory regions
- From: "Raimund dot Merkert at baesystems dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 7 Jul 2007 17:55:23 -0000
- Subject: [Bug c++/32667] New: builtin operator= generates memcpy with overlapping memory regions
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
This code generates a warning when run with valgrind:
#include <vector>
using namespace ::std;
struct X {
double values[10];
};
int main()
{
vector<X> x;
x.push_back(X());
for (vector<X>::iterator i=x.begin();i!=x.end();++i) {
*i = *(x.end()-1);
}
return 0;
}
g++ test.cpp -o foo -O3
Valgrind error:
valgrind --tool=memcheck foo
==24513== Memcheck, a memory error detector for x86-linux.
==24513== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.
==24513== Using valgrind-2.2.0, a program supervision framework for x86-linux.
==24513== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al.
==24513== For more details, rerun with: -v
==24513==
==24513== Source and destination overlap in memcpy(0x1BB68028, 0x1BB68028, 80)
==24513== at 0x1B9057E5: memcpy (in /usr/lib/valgrind/vgpreload_memcheck.so)
==24513== by 0x8048696: main (in /home/ray/tmp/foo)
==24513==
==24513== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 1)
==24513== malloc/free: in use at exit: 0 bytes in 0 blocks.
==24513== malloc/free: 1 allocs, 1 frees, 80 bytes allocated.
==24513== For a detailed leak analysis, rerun with: --leak-check=yes
==24513== For counts of detected errors, rerun with: -v
On my machine "man memcpy" says "...The memory areas may not overlap. Use
memmove(3) if the memory areas do overlap. ..."
--
Summary: builtin operator= generates memcpy with overlapping
memory regions
Product: gcc
Version: 4.2.0
Status: UNCONFIRMED
Severity: major
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: Raimund dot Merkert at baesystems dot com
GCC host triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32667