diff mbox series

[v2] ubsan: Avoid -Wpadded warnings [PR94641]

Message ID 20200421073812.GV2424@tucnak
State New
Headers show
Series [v2] ubsan: Avoid -Wpadded warnings [PR94641] | expand

Commit Message

Jakub Jelinek April 21, 2020, 7:38 a.m. UTC
Hi!

On Tue, Apr 21, 2020 at 08:21:36AM +0200, Richard Biener wrote:
> I believe most of those warnings should simply not look at
> TYPE_ARTIFICIAL types.  So why the above kludge certainly
> works a better fix is on the -Wpadded side IMHO.

So like this if it passes bootstrap/regtest?

2020-04-21  Jakub Jelinek  <jakub@redhat.com>

	PR c/94641
	* stor-layout.c (place_field, finalize_record_size): Don't emit
	-Wpadded warning on TYPE_ARTIFICIAL rli->t.
	* ubsan.c (ubsan_get_type_descriptor_type,
	ubsan_get_source_location_type, ubsan_create_data): Set
	TYPE_ARTIFICIAL.
	* asan.c (asan_global_struct): Likewise.

	* c-c++-common/ubsan/pr94641.c: New test.



	Jakub

Comments

Richard Biener April 21, 2020, 7:39 a.m. UTC | #1
On Tue, 21 Apr 2020, Jakub Jelinek wrote:

> Hi!
> 
> On Tue, Apr 21, 2020 at 08:21:36AM +0200, Richard Biener wrote:
> > I believe most of those warnings should simply not look at
> > TYPE_ARTIFICIAL types.  So why the above kludge certainly
> > works a better fix is on the -Wpadded side IMHO.
> 
> So like this if it passes bootstrap/regtest?

Yes.

Thanks,
Richard.

> 2020-04-21  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR c/94641
> 	* stor-layout.c (place_field, finalize_record_size): Don't emit
> 	-Wpadded warning on TYPE_ARTIFICIAL rli->t.
> 	* ubsan.c (ubsan_get_type_descriptor_type,
> 	ubsan_get_source_location_type, ubsan_create_data): Set
> 	TYPE_ARTIFICIAL.
> 	* asan.c (asan_global_struct): Likewise.
> 
> 	* c-c++-common/ubsan/pr94641.c: New test.
> 
> --- gcc/stor-layout.c.jj	2020-01-12 11:54:36.935405533 +0100
> +++ gcc/stor-layout.c	2020-04-21 09:34:27.743871177 +0200
> @@ -1341,7 +1341,8 @@ place_field (record_layout_info rli, tre
>  	 Bump the cumulative size to multiple of field alignment.  */
>  
>        if (!targetm.ms_bitfield_layout_p (rli->t)
> -          && DECL_SOURCE_LOCATION (field) != BUILTINS_LOCATION)
> +          && DECL_SOURCE_LOCATION (field) != BUILTINS_LOCATION
> +          && !TYPE_ARTIFICIAL (rli->t))
>  	warning (OPT_Wpadded, "padding struct to align %q+D", field);
>  
>        /* If the alignment is still within offset_align, just align
> @@ -1775,7 +1776,8 @@ finalize_record_size (record_layout_info
>  
>    if (TREE_CONSTANT (unpadded_size)
>        && simple_cst_equal (unpadded_size, TYPE_SIZE (rli->t)) == 0
> -      && input_location != BUILTINS_LOCATION)
> +      && input_location != BUILTINS_LOCATION
> +      && !TYPE_ARTIFICIAL (rli->t))
>      warning (OPT_Wpadded, "padding struct size to alignment boundary");
>  
>    if (warn_packed && TREE_CODE (rli->t) == RECORD_TYPE
> --- gcc/ubsan.c.jj	2020-04-20 11:46:07.892145312 +0200
> +++ gcc/ubsan.c	2020-04-21 09:25:46.494055822 +0200
> @@ -229,6 +229,7 @@ ubsan_get_type_descriptor_type (void)
>    TYPE_FIELDS (ret) = fields[0];
>    TYPE_NAME (ret) = type_decl;
>    TYPE_STUB_DECL (ret) = type_decl;
> +  TYPE_ARTIFICIAL (ret) = 1;
>    layout_type (ret);
>    ubsan_type_descriptor_type = ret;
>    return ret;
> @@ -277,6 +278,7 @@ ubsan_get_source_location_type (void)
>    TYPE_FIELDS (ret) = fields[0];
>    TYPE_NAME (ret) = type_decl;
>    TYPE_STUB_DECL (ret) = type_decl;
> +  TYPE_ARTIFICIAL (ret) = 1;
>    layout_type (ret);
>    ubsan_source_location_type = ret;
>    return ret;
> @@ -593,6 +595,7 @@ ubsan_create_data (const char *name, int
>    TYPE_FIELDS (ret) = fields[0];
>    TYPE_NAME (ret) = type_decl;
>    TYPE_STUB_DECL (ret) = type_decl;
> +  TYPE_ARTIFICIAL (ret) = 1;
>    layout_type (ret);
>  
>    /* Now, fill in the type.  */
> --- gcc/asan.c.jj	2020-03-18 13:36:22.004021340 +0100
> +++ gcc/asan.c	2020-04-21 09:28:00.692968875 +0200
> @@ -2661,6 +2661,7 @@ asan_global_struct (void)
>    TYPE_FIELDS (ret) = fields[0];
>    TYPE_NAME (ret) = type_decl;
>    TYPE_STUB_DECL (ret) = type_decl;
> +  TYPE_ARTIFICIAL (ret) = 1;
>    layout_type (ret);
>    return ret;
>  }
> --- gcc/testsuite/c-c++-common/ubsan/pr94641.c.jj	2020-04-21 09:24:36.694141289 +0200
> +++ gcc/testsuite/c-c++-common/ubsan/pr94641.c	2020-04-21 09:24:36.694141289 +0200
> @@ -0,0 +1,11 @@
> +/* PR c/94641 */
> +/* { dg-do compile } */
> +/* { dg-options "-fsanitize=undefined -Wpadded" } */
> +
> +void foo (void *) __attribute__((nonnull));
> +
> +void
> +bar (void *p)
> +{
> +  foo (p);
> +}
> 
> 
> 	Jakub
> 
>
diff mbox series

Patch

--- gcc/stor-layout.c.jj	2020-01-12 11:54:36.935405533 +0100
+++ gcc/stor-layout.c	2020-04-21 09:34:27.743871177 +0200
@@ -1341,7 +1341,8 @@  place_field (record_layout_info rli, tre
 	 Bump the cumulative size to multiple of field alignment.  */
 
       if (!targetm.ms_bitfield_layout_p (rli->t)
-          && DECL_SOURCE_LOCATION (field) != BUILTINS_LOCATION)
+          && DECL_SOURCE_LOCATION (field) != BUILTINS_LOCATION
+          && !TYPE_ARTIFICIAL (rli->t))
 	warning (OPT_Wpadded, "padding struct to align %q+D", field);
 
       /* If the alignment is still within offset_align, just align
@@ -1775,7 +1776,8 @@  finalize_record_size (record_layout_info
 
   if (TREE_CONSTANT (unpadded_size)
       && simple_cst_equal (unpadded_size, TYPE_SIZE (rli->t)) == 0
-      && input_location != BUILTINS_LOCATION)
+      && input_location != BUILTINS_LOCATION
+      && !TYPE_ARTIFICIAL (rli->t))
     warning (OPT_Wpadded, "padding struct size to alignment boundary");
 
   if (warn_packed && TREE_CODE (rli->t) == RECORD_TYPE
--- gcc/ubsan.c.jj	2020-04-20 11:46:07.892145312 +0200
+++ gcc/ubsan.c	2020-04-21 09:25:46.494055822 +0200
@@ -229,6 +229,7 @@  ubsan_get_type_descriptor_type (void)
   TYPE_FIELDS (ret) = fields[0];
   TYPE_NAME (ret) = type_decl;
   TYPE_STUB_DECL (ret) = type_decl;
+  TYPE_ARTIFICIAL (ret) = 1;
   layout_type (ret);
   ubsan_type_descriptor_type = ret;
   return ret;
@@ -277,6 +278,7 @@  ubsan_get_source_location_type (void)
   TYPE_FIELDS (ret) = fields[0];
   TYPE_NAME (ret) = type_decl;
   TYPE_STUB_DECL (ret) = type_decl;
+  TYPE_ARTIFICIAL (ret) = 1;
   layout_type (ret);
   ubsan_source_location_type = ret;
   return ret;
@@ -593,6 +595,7 @@  ubsan_create_data (const char *name, int
   TYPE_FIELDS (ret) = fields[0];
   TYPE_NAME (ret) = type_decl;
   TYPE_STUB_DECL (ret) = type_decl;
+  TYPE_ARTIFICIAL (ret) = 1;
   layout_type (ret);
 
   /* Now, fill in the type.  */
--- gcc/asan.c.jj	2020-03-18 13:36:22.004021340 +0100
+++ gcc/asan.c	2020-04-21 09:28:00.692968875 +0200
@@ -2661,6 +2661,7 @@  asan_global_struct (void)
   TYPE_FIELDS (ret) = fields[0];
   TYPE_NAME (ret) = type_decl;
   TYPE_STUB_DECL (ret) = type_decl;
+  TYPE_ARTIFICIAL (ret) = 1;
   layout_type (ret);
   return ret;
 }
--- gcc/testsuite/c-c++-common/ubsan/pr94641.c.jj	2020-04-21 09:24:36.694141289 +0200
+++ gcc/testsuite/c-c++-common/ubsan/pr94641.c	2020-04-21 09:24:36.694141289 +0200
@@ -0,0 +1,11 @@ 
+/* PR c/94641 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=undefined -Wpadded" } */
+
+void foo (void *) __attribute__((nonnull));
+
+void
+bar (void *p)
+{
+  foo (p);
+}