This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/70644] New: Warn about implicit conversion of 'this' to pointer to virtual base class during construction
- From: "redi at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 13 Apr 2016 07:38:53 +0000
- Subject: [Bug c++/70644] New: Warn about implicit conversion of 'this' to pointer to virtual base class during construction
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70644
Bug ID: 70644
Summary: Warn about implicit conversion of 'this' to pointer to
virtual base class during construction
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Keywords: diagnostic
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
(Reduced from PR 58822)
struct Base { Base(int) { } };
int foo(Base*) { return 0; }
struct X : virtual Base {
X() : Base(foo(this)) { }
};
int main() {
X x;
}
The implicit conversion in the call foo(this) is undefined behaviour. It
violates [basic.life] 3.8p6 (6.3) by converting the object's address to a
pointer to virtual base before it is constructed.
There is no warning, and no ubsan error.
If the implicit conversion happens in a different scope, not inside the
constructor, then we get a ubsan error (and segfault):
struct Base { Base(int) { } };
struct X;
int foo(X*);
struct X : virtual Base {
X() : Base(foo(this)) { }
};
int foo(X* x) { Base* b = x; return 0; }
int main() {
X x;
}
vb.cc:10:27: runtime error: cast to virtual base of address 0x7ffd25ef32f0
which does not point to an object of type 'X'
0x7ffd25ef32f0: note: object has invalid vptr
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90 0a 40 00 00
00 00 00 80 65 20 63
^~~~~~~~~~~~~~~~~~~~~~~
invalid vptr
Segmentation fault (core dumped)
Since the original example is also UB it would be good to either get a
diagnostic from the front end at the point of the implicit conversion, or at
least get a ubsan error..