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

Jakub Jelinek jakub@redhat.com
Tue Apr 21 07:38:12 GMT 2020


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.

--- 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



More information about the Gcc-patches mailing list