re PR sanitizer/70147 (testcase from hana testsuite gets miscompiled with -fsanitize...
authorJakub Jelinek <jakub@redhat.com>
Wed, 16 Mar 2016 07:02:30 +0000 (08:02 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 16 Mar 2016 07:02:30 +0000 (08:02 +0100)
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.

From-SVN: r234249

gcc/cp/ChangeLog
gcc/cp/cp-ubsan.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ubsan/pr70147-2.C

index ee2ae896f71d93866d62c16ce695decbc733df17..b1424136a08f96995794ac7de59d4c16eeae47a0 100644 (file)
@@ -1,5 +1,9 @@
 2016-03-16  Jakub Jelinek  <jakub@redhat.com>
 
+       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.
index d4759da7a25a02d3b604de9ced863c74da9b866f..75aeeb83e35b03eac80e1bdce18e717905171fa1 100644 (file)
@@ -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;
index 3f4d6142dca014eefa44eec75225fb7ffb576be6..52994ccf3317a9489633b6ae3330c3ed50cf65b0 100644 (file)
@@ -1,5 +1,9 @@
 2016-03-16  Jakub Jelinek  <jakub@redhat.com>
 
+       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.
index b74249fe3ec45da3c22945ceb9def9130a081df9..4e858a52d5a2fc9e74bc5262d21275d51b460cb7 100644 (file)
@@ -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)" }