aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2014-03-19 12:25:04 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2014-03-19 12:25:04 +0000
commit6daa2d914b638ea400bc42a3e29a6d1cdf602ea1 (patch)
tree796c13eb2bc2bb780bf167d29b9e9996dfe83e67 /gcc
parentbd9972776107a0e19931603863a2a342d1c7220b (diff)
downloadgcc-6daa2d914b638ea400bc42a3e29a6d1cdf602ea1.zip
gcc-6daa2d914b638ea400bc42a3e29a6d1cdf602ea1.tar.gz
gcc-6daa2d914b638ea400bc42a3e29a6d1cdf602ea1.tar.bz2
re PR sanitizer/60569 (Segfault with -flto and -fsanitize=undefined)
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. From-SVN: r208681
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ubsan/pr60569.C21
-rw-r--r--gcc/ubsan.c2
4 files changed, 33 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9b85e2d..3ab789a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2014-03-19 Richard Biener <rguenther@suse.de>
PR lto/59543
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 36e53f8..9891638 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-03-19 Marek Polacek <polacek@redhat.com>
+
+ PR sanitizer/60569
+ * g++.dg/ubsan/pr60569.C: New test.
+
2014-03-19 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* gcc.dg/tls/pr58595.c: Require tls_runtime instead of tls.
diff --git a/gcc/testsuite/g++.dg/ubsan/pr60569.C b/gcc/testsuite/g++.dg/ubsan/pr60569.C
new file mode 100644
index 0000000..df57c06
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ubsan/pr60569.C
@@ -0,0 +1,21 @@
+// PR sanitizer/60569
+// { dg-do link }
+// { 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 a/gcc/ubsan.c b/gcc/ubsan.c
index 7c7a893..22470da 100644
--- a/gcc/ubsan.c
+++ b/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)));
}