https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84851
Bug ID: 84851
Summary: missing -Wclass-memaccess for a memcpy in a copy ctor
with a non-trivial member
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
-Wclass-memaccess excempts ctors and dtors of non-polymorphic classes from
checking for raw memory accesses, but the warning does trigger for such
accesses in classes with a virtual table to help detect virtual table
corruption. However, the exemption is too broad and allows for the corruption
of virtual tables or subobjects with non-trivial members.
$ cat u.C && gcc -S -Wall -Wextra u.C
struct A
{
const int &r;
A ();
A (const A&);
virtual ~A ();
};
struct B: A
{
B (const B&);
};
B::B (const B &b)
{
__builtin_memcpy (this, &b, sizeof b); // -Wclass-memaccess (good)
}
struct C
{
A a;
C (const C&);
};
C::C (const C &c)
{
__builtin_memcpy (this, &c, sizeof c); // missing -Wclass-memaccess
}
u.C: In copy constructor ‘B::B(const B&)’:
u.C:17:1: warning: base class ‘struct A’ should be explicitly initialized in
the copy constructor [-Wextra]
B::B (const B &b)
^
u.C:19:39: warning: ‘void* __builtin_memcpy(void*, const void*, long unsigned
int)’ writing to an object of type ‘struct B’ with no trivial copy-assignment;
use copy-initialization instead [-Wclass-memaccess]
__builtin_memcpy (this, &b, sizeof b); // -Wclass-memaccess (good)
^
u.C:12:8: note: ‘struct B’ declared here
struct B: A
^