public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: Stefano Brivio <sbrivio@redhat.com>
To: passt-dev@passt.top
Subject: [PATCH 2/2] udp: Replace pragma to ignore bogus stringop-overread warning with workaround
Date: Wed, 28 Sep 2022 21:00:30 +0200	[thread overview]
Message-ID: <20220928190030.1379963-3-sbrivio@redhat.com> (raw)
In-Reply-To: <20220928190030.1379963-1-sbrivio@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 3734 bytes --]

Commit c318ffcb4c93 ("udp: Ignore bogus -Wstringop-overread for
write() from gcc 12.1") uses a gcc pragma to ignore a bogus warning,
which started appearing on gcc 12.1 (aarch64 and x86_64) due to:
  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103483

...but gcc 12.2 has the same issue. Not just that: if LTO is enabled,
the pragma itself is ignored (this wasn't the case with gcc 12.1),
because of:
  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80922

Drop the pragma, and assign a frame (in the networking sense) pointer
from the offset of the Ethernet header in the buffer, then pass it to
write() and pcap(), so that gcc doesn't obsess anymore with the fact
that an Ethernet header is 14 bytes and we're sending more than that.

Signed-off-by: Stefano Brivio <sbrivio(a)redhat.com>
---
 udp.c  | 26 ++++++++++++++++++--------
 util.h | 23 -----------------------
 2 files changed, 18 insertions(+), 31 deletions(-)

diff --git a/udp.c b/udp.c
index bd3dc72..d1be622 100644
--- a/udp.c
+++ b/udp.c
@@ -704,11 +704,20 @@ static void udp_sock_fill_data_v4(const struct ctx *c, int n,
 	b->uh.len = htons(udp4_l2_mh_sock[n].msg_len + sizeof(b->uh));
 
 	if (c->mode == MODE_PASTA) {
-		PRAGMA_STRINGOP_OVERREAD_IGNORE
-		if (write(c->fd_tap, &b->eh, sizeof(b->eh) + ip_len) < 0)
+		/* If we pass &b->eh directly to write(), starting from
+		 * gcc 12.1, at least on aarch64 and x86_64, we get a bogus
+		 * stringop-overread warning, due to:
+		 *   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103483
+		 *
+		 * but we can't disable it with a pragma, because it will be
+		 * ignored if LTO is enabled:
+		 *   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80922
+		 */
+		void *frame = (char *)b + offsetof(struct udp4_l2_buf_t, eh);
+
+		if (write(c->fd_tap, frame, sizeof(b->eh) + ip_len) < 0)
 			debug("tap write: %s", strerror(errno));
-		PRAGMA_STRINGOP_OVERREAD_IGNORE_POP
-		pcap((char *)&b->eh, sizeof(b->eh) + ip_len);
+		pcap(frame, sizeof(b->eh) + ip_len);
 
 		return;
 	}
@@ -805,11 +814,12 @@ static void udp_sock_fill_data_v6(const struct ctx *c, int n,
 	b->ip6h.hop_limit = 255;
 
 	if (c->mode == MODE_PASTA) {
-		PRAGMA_STRINGOP_OVERREAD_IGNORE
-		if (write(c->fd_tap, &b->eh, sizeof(b->eh) + ip_len) < 0)
+		/* See udp_sock_fill_data_v4() for the reason behind 'frame' */
+		void *frame = (char *)b + offsetof(struct udp6_l2_buf_t, eh);
+
+		if (write(c->fd_tap, frame, sizeof(b->eh) + ip_len) < 0)
 			debug("tap write: %s", strerror(errno));
-		PRAGMA_STRINGOP_OVERREAD_IGNORE_POP
-		pcap((char *)&b->eh, sizeof(b->eh) + ip_len);
+		pcap(frame, sizeof(b->eh) + ip_len);
 
 		return;
 	}
diff --git a/util.h b/util.h
index 0c3c994..0c06e34 100644
--- a/util.h
+++ b/util.h
@@ -96,29 +96,6 @@ void trace_init(int enable);
 		      (void *)(arg));					\
 	} while (0)
 
-
-#ifdef __has_warning
-# if __has_warning("-Wstringop-overread")
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE				\
-     _Pragma("GCC diagnostic ignored \"-Wstringop-overread\"")
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE_POP				\
-     _Pragma("GCC diagnostic pop")
-# else
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE_POP
-# endif
-#else
-# if defined(__GNUC__) && __GNUC__ >= 11
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE				\
-     _Pragma("GCC diagnostic ignored \"-Wstringop-overread\"")
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE_POP				\
-     _Pragma("GCC diagnostic pop")
-# else
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE_POP
-# endif
-#endif
-
 #if __BYTE_ORDER == __BIG_ENDIAN
 #define L2_BUF_ETH_IP4_INIT						\
 	{								\
-- 
@@ -96,29 +96,6 @@ void trace_init(int enable);
 		      (void *)(arg));					\
 	} while (0)
 
-
-#ifdef __has_warning
-# if __has_warning("-Wstringop-overread")
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE				\
-     _Pragma("GCC diagnostic ignored \"-Wstringop-overread\"")
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE_POP				\
-     _Pragma("GCC diagnostic pop")
-# else
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE_POP
-# endif
-#else
-# if defined(__GNUC__) && __GNUC__ >= 11
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE				\
-     _Pragma("GCC diagnostic ignored \"-Wstringop-overread\"")
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE_POP				\
-     _Pragma("GCC diagnostic pop")
-# else
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE
-#  define PRAGMA_STRINGOP_OVERREAD_IGNORE_POP
-# endif
-#endif
-
 #if __BYTE_ORDER == __BIG_ENDIAN
 #define L2_BUF_ETH_IP4_INIT						\
 	{								\
-- 
2.35.1


      parent reply	other threads:[~2022-09-28 19:00 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-28 19:00 [PATCH 0/2] Address warnings from gcc 12.2 with -flto Stefano Brivio
2022-09-28 19:00 ` [PATCH 1/2] Makefile: Extend noinline workarounds for LTO and -O2 to gcc 12 Stefano Brivio
2022-09-28 19:00 ` Stefano Brivio [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220928190030.1379963-3-sbrivio@redhat.com \
    --to=sbrivio@redhat.com \
    --cc=passt-dev@passt.top \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).