diff mbox

Strip array types when getting the typename (PR sanitizer/59667)

Message ID 20140107135944.GF29237@redhat.com
State New
Headers show

Commit Message

Marek Polacek Jan. 7, 2014, 1:59 p.m. UTC
In case we're dealing with (*)[N] types, we should strip the
ARRAY_TYPEs prior to getting the type name.  Otherwise we segv, since
the DECL_NAME is NULL.

Regtested on x86_64-linux, ok for trunk?

2014-01-07  Marek Polacek  <polacek@redhat.com>

	PR sanitizer/59667
	* ubsan.c (ubsan_type_descriptor): Call strip_array_types on type2.
testsuite/
	* c-c++-common/ubsan/pr59667.c: New test.


	Marek

Comments

Jeff Law Jan. 7, 2014, 9:29 p.m. UTC | #1
On 01/07/14 06:59, Marek Polacek wrote:
> In case we're dealing with (*)[N] types, we should strip the
> ARRAY_TYPEs prior to getting the type name.  Otherwise we segv, since
> the DECL_NAME is NULL.
>
> Regtested on x86_64-linux, ok for trunk?
>
> 2014-01-07  Marek Polacek  <polacek@redhat.com>
>
> 	PR sanitizer/59667
> 	* ubsan.c (ubsan_type_descriptor): Call strip_array_types on type2.
> testsuite/
> 	* c-c++-common/ubsan/pr59667.c: New test.
OK.
Jeff
diff mbox

Patch

--- gcc/ubsan.c.mp	2014-01-07 14:37:46.782944043 +0100
+++ gcc/ubsan.c	2014-01-07 14:37:53.740972042 +0100
@@ -311,6 +311,9 @@  ubsan_type_descriptor (tree type, bool w
         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)
--- gcc/testsuite/c-c++-common/ubsan/pr59667.c.mp	2014-01-07 14:50:39.956271370 +0100
+++ gcc/testsuite/c-c++-common/ubsan/pr59667.c	2014-01-07 14:44:10.244545879 +0100
@@ -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)" } */