From 06636b3267e8753b7303b68f935a1913d7df8024 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Wed, 8 Jan 2014 10:06:09 +0000 Subject: [PATCH] re PR sanitizer/59667 (ubsan: ICE ubsan_type_descriptor) PR sanitizer/59667 * ubsan.c (ubsan_type_descriptor): Call strip_array_types on type2. testsuite/ * c-c++-common/ubsan/pr59667.c: New test. From-SVN: r206423 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/c-c++-common/ubsan/pr59667.c | 15 +++++++++++++++ gcc/ubsan.c | 3 +++ 4 files changed, 28 insertions(+) create mode 100644 gcc/testsuite/c-c++-common/ubsan/pr59667.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8888a79ae5b..5ff7cd027f4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-01-08 Marek Polacek + + PR sanitizer/59667 + * ubsan.c (ubsan_type_descriptor): Call strip_array_types on type2. + 2014-01-08 Jakub Jelinek PR rtl-optimization/59649 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d113f2a09e4..f9111f94dba 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-01-08 Marek Polacek + + PR sanitizer/59667 + * c-c++-common/ubsan/pr59667.c: New test. + 2014-01-08 Richard Biener PR middle-end/59630 diff --git a/gcc/testsuite/c-c++-common/ubsan/pr59667.c b/gcc/testsuite/c-c++-common/ubsan/pr59667.c new file mode 100644 index 00000000000..367e3034629 --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/pr59667.c @@ -0,0 +1,15 @@ +/* { dg-do run } */ +/* { dg-options "-fsanitize=undefined" } */ +/* { dg-shouldfail "ubsan" } */ +/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */ + +int +main (void) +{ + unsigned int len = 1; + float (*P)[len][len] = 0; + (*P)[0][0] = 1; + return 0; +} + +/* { dg-output "store to null pointer of type 'float'(\n|\r\n|\r)" } */ diff --git a/gcc/ubsan.c b/gcc/ubsan.c index 7cc8c180ba8..1841a947b9c 100644 --- a/gcc/ubsan.c +++ b/gcc/ubsan.c @@ -311,6 +311,9 @@ ubsan_type_descriptor (tree type, bool want_pointer_type_p) type2 = TYPE_METHOD_BASETYPE (type2); } + /* If an array, get its type. */ + type2 = strip_array_types (type2); + if (TYPE_NAME (type2) != NULL) { if (TREE_CODE (TYPE_NAME (type2)) == IDENTIFIER_NODE)