[PATCH] Fix ubsan ICE (PR sanitizer/60569)

Marek Polacek polacek@redhat.com
Wed Mar 19 11:17:00 GMT 2014


Apparently with LTO we can get a TYPE_NAME without a DECL_NAME,
so check that it exists before accessing it.
Note that the test has to be run; only compiling wasn't enough
to provoke the ICE.

Ran ubsan testsuite on x86_64-linux, ok for trunk?

2014-03-19  Marek Polacek  <polacek@redhat.com>

	PR sanitizer/60569
	* ubsan.c (ubsan_type_descriptor): Check that DECL_NAME is nonnull
	before accessing it.
testsuite/
	* g++.dg/ubsan/pr60569.C: New test.

diff --git gcc/testsuite/g++.dg/ubsan/pr60569.C gcc/testsuite/g++.dg/ubsan/pr60569.C
index e69de29..df6b7a4 100644
--- gcc/testsuite/g++.dg/ubsan/pr60569.C
+++ gcc/testsuite/g++.dg/ubsan/pr60569.C
@@ -0,0 +1,21 @@
+// PR sanitizer/60569
+// { dg-do run }
+// { dg-require-effective-target lto }
+// { dg-options "-fsanitize=undefined -flto" }
+
+struct A
+{
+  void foo ();
+  struct
+  {
+    int i;
+    void bar () { i = 0; }
+  } s;
+};
+
+void A::foo () { s.bar (); }
+
+int
+main ()
+{
+}
diff --git gcc/ubsan.c gcc/ubsan.c
index 7c7a893..22470da 100644
--- gcc/ubsan.c
+++ gcc/ubsan.c
@@ -318,7 +318,7 @@ ubsan_type_descriptor (tree type, bool want_pointer_type_p)
     {
       if (TREE_CODE (TYPE_NAME (type2)) == IDENTIFIER_NODE)
 	tname = IDENTIFIER_POINTER (TYPE_NAME (type2));
-      else
+      else if (DECL_NAME (TYPE_NAME (type2)) != NULL)
 	tname = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type2)));
     }
 

	Marek



More information about the Gcc-patches mailing list