From 81fc5915abf600da69d7ad3043b17fa561fabc94 Mon Sep 17 00:00:00 2001 From: jakub Date: Wed, 16 Mar 2016 07:02:30 +0000 Subject: PR c++/70147 * cp-ubsan.c (cp_ubsan_dfs_initialize_vtbl_ptrs): Conditionalize BINFO_VIRTUAL_P vtable clearing on current_in_charge_parm. * g++.dg/ubsan/pr70147-2.C (C::C): Initialize A base with invalid method call to i () as argument. Adjust expected output. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234249 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/cp-ubsan.c | 10 ++++++++-- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/ubsan/pr70147-2.C | 18 ++++++------------ 4 files changed, 22 insertions(+), 14 deletions(-) (limited to 'gcc') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ee2ae896f71..b1424136a08 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2016-03-16 Jakub Jelinek + PR c++/70147 + * cp-ubsan.c (cp_ubsan_dfs_initialize_vtbl_ptrs): Conditionalize + BINFO_VIRTUAL_P vtable clearing on current_in_charge_parm. + PR c++/70147 * cp-ubsan.c (cp_ubsan_maybe_initialize_vtbl_ptrs): Temporarily set in_base_initializer. diff --git a/gcc/cp/cp-ubsan.c b/gcc/cp/cp-ubsan.c index d4759da7a25..75aeeb83e35 100644 --- a/gcc/cp/cp-ubsan.c +++ b/gcc/cp/cp-ubsan.c @@ -299,8 +299,14 @@ cp_ubsan_dfs_initialize_vtbl_ptrs (tree binfo, void *data) /* Assign NULL to the vptr. */ tree vtbl = build_zero_cst (TREE_TYPE (vtbl_ptr)); - finish_expr_stmt (cp_build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl, - tf_warning_or_error)); + tree stmt = cp_build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl, + tf_warning_or_error); + if (BINFO_VIRTUAL_P (binfo)) + stmt = build3 (COND_EXPR, void_type_node, + build2 (NE_EXPR, boolean_type_node, + current_in_charge_parm, integer_zero_node), + stmt, void_node); + finish_expr_stmt (stmt); } return NULL_TREE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3f4d6142dca..52994ccf331 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2016-03-16 Jakub Jelinek + PR c++/70147 + * g++.dg/ubsan/pr70147-2.C (C::C): Initialize A base with invalid + method call to i () as argument. Adjust expected output. + PR c++/70147 * g++.dg/ubsan/pr70147-1.C: New test. * g++.dg/ubsan/pr70147-2.C: New test. diff --git a/gcc/testsuite/g++.dg/ubsan/pr70147-2.C b/gcc/testsuite/g++.dg/ubsan/pr70147-2.C index b74249fe3ec..4e858a52d5a 100644 --- a/gcc/testsuite/g++.dg/ubsan/pr70147-2.C +++ b/gcc/testsuite/g++.dg/ubsan/pr70147-2.C @@ -46,7 +46,7 @@ struct B : virtual A, public E, public F }; struct C : B, virtual A { - C () {} + C () : A (i ()) {} }; int @@ -55,28 +55,22 @@ main () C c; } -// { dg-output "\[^\n\r]*pr70147-2.C:33:\[0-9]*: runtime error: member call on address 0x\[0-9a-fA-F]* which does not point to an object of type 'E'(\n|\r\n|\r)" } -// { dg-output "0x\[0-9a-fA-F]*: note: object has invalid vptr(\n|\r\n|\r)" } -// { dg-output " ?.. .. .. .. ?.. .. .. .. ?.. .. .. .. \[^\n\r]*(\n|\r\n|\r)" } -// { dg-output " ?\\^~~~~~~~~~~\[^\n\r]*(\n|\r\n|\r)" } -// { dg-output " ?invalid vptr(\n|\r\n|\r)" } -// { dg-output "\[^\n\r]*pr70147-2.C:34:\[0-9]*: runtime error: member call on address 0x\[0-9a-fA-F]* which does not point to an object of type 'F'(\n|\r\n|\r)" } +// { dg-output "\[^\n\r]*pr70147-2.C:49:\[0-9]*: runtime error: member call on address 0x\[0-9a-fA-F]* which does not point to an object of type 'A'(\n|\r\n|\r)" } // { dg-output "0x\[0-9a-fA-F]*: note: object has invalid vptr(\n|\r\n|\r)" } // { dg-output " ?.. .. .. .. ?.. .. .. .. ?.. .. .. .. \[^\n\r]*(\n|\r\n|\r)" } // { dg-output " ?\\^~~~~~~~~~~\[^\n\r]*(\n|\r\n|\r)" } // { dg-output " ?invalid vptr\[^\n\r]*(\n|\r\n|\r)" } -// { dg-output "\[^\n\r]*pr70147-2.C:35:\[0-9]*: runtime error: member call on address 0x\[0-9a-fA-F]* which does not point to an object of type 'A'(\n|\r\n|\r)" } +// { dg-output "\[^\n\r]*pr70147-2.C:33:\[0-9]*: runtime error: member call on address 0x\[0-9a-fA-F]* which does not point to an object of type 'E'(\n|\r\n|\r)" } // { dg-output "0x\[0-9a-fA-F]*: note: object has invalid vptr(\n|\r\n|\r)" } // { dg-output " ?.. .. .. .. ?.. .. .. .. ?.. .. .. .. \[^\n\r]*(\n|\r\n|\r)" } // { dg-output " ?\\^~~~~~~~~~~\[^\n\r]*(\n|\r\n|\r)" } -// { dg-output " ?invalid vptr\[^\n\r]*(\n|\r\n|\r)" } -// Note we don't catch the UB of calling g () on line 36. -// { dg-output "\[^\n\r]*pr70147-2.C:38:\[0-9]*: runtime error: member call on address 0x\[0-9a-fA-F]* which does not point to an object of type 'F'(\n|\r\n|\r)" } +// { dg-output " ?invalid vptr(\n|\r\n|\r)" } +// { dg-output "\[^\n\r]*pr70147-2.C:34:\[0-9]*: runtime error: member call on address 0x\[0-9a-fA-F]* which does not point to an object of type 'F'(\n|\r\n|\r)" } // { dg-output "0x\[0-9a-fA-F]*: note: object has invalid vptr(\n|\r\n|\r)" } // { dg-output " ?.. .. .. .. ?.. .. .. .. ?.. .. .. .. \[^\n\r]*(\n|\r\n|\r)" } // { dg-output " ?\\^~~~~~~~~~~\[^\n\r]*(\n|\r\n|\r)" } // { dg-output " ?invalid vptr\[^\n\r]*(\n|\r\n|\r)" } -// { dg-output "\[^\n\r]*pr70147-2.C:39:\[0-9]*: runtime error: member call on address 0x\[0-9a-fA-F]* which does not point to an object of type 'A'(\n|\r\n|\r)" } +// { dg-output "\[^\n\r]*pr70147-2.C:38:\[0-9]*: runtime error: member call on address 0x\[0-9a-fA-F]* which does not point to an object of type 'F'(\n|\r\n|\r)" } // { dg-output "0x\[0-9a-fA-F]*: note: object has invalid vptr(\n|\r\n|\r)" } // { dg-output " ?.. .. .. .. ?.. .. .. .. ?.. .. .. .. \[^\n\r]*(\n|\r\n|\r)" } // { dg-output " ?\\^~~~~~~~~~~\[^\n\r]*(\n|\r\n|\r)" } -- cgit v1.2.3