81 lines
3.1 KiB
Diff
81 lines
3.1 KiB
Diff
From 45a91b33b7de48d4ee8875d2fcc6be04d7e3919c Mon Sep 17 00:00:00 2001
|
||
From: Linus Torvalds <torvalds@linux-foundation.org>
|
||
Date: Sun, 20 Apr 2025 10:33:23 -0700
|
||
Subject: gcc-15: make 'unterminated string initialization' just a warning
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
gcc-15 enabling -Wunterminated-string-initialization in -Wextra by
|
||
default was done with the best intentions, but the warning is still
|
||
quite broken.
|
||
|
||
What annoys me about the warning is that this is a very traditional AND
|
||
CORRECT way to initialize fixed byte arrays in C:
|
||
|
||
unsigned char hex[16] = "0123456789abcdef";
|
||
|
||
and we use this all over the kernel. And the warning is fine, but gcc
|
||
developers apparently never made a reasonable way to disable it. As is
|
||
(sadly) tradition with these things.
|
||
|
||
Yes, there's "__attribute__((nonstring))", and we have a macro to make
|
||
that absolutely disgusting syntax more palatable (ie the kernel syntax
|
||
for that monstrosity is just "__nonstring").
|
||
|
||
But that attribute is misdesigned. What you'd typically want to do is
|
||
tell the compiler that you are using a type that isn't a string but a
|
||
byte array, but that doesn't work at all:
|
||
|
||
warning: ‘nonstring’ attribute does not apply to types [-Wattributes]
|
||
|
||
and because of this fundamental mis-design, you then have to mark each
|
||
instance of that pattern.
|
||
|
||
This is particularly noticeable in our ACPI code, because ACPI has this
|
||
notion of a 4-byte "type name" that gets used all over, and is exactly
|
||
this kind of byte array.
|
||
|
||
This is a sad oversight, because the warning is useful, but really would
|
||
be so much better if gcc had also given a sane way to indicate that we
|
||
really just want a byte array type at a type level, not the broken "each
|
||
and every array definition" level.
|
||
|
||
So now instead of creating a nice "ACPI name" type using something like
|
||
|
||
typedef char acpi_name_t[4] __nonstring;
|
||
|
||
we have to do things like
|
||
|
||
char name[ACPI_NAMESEG_SIZE] __nonstring;
|
||
|
||
in every place that uses this concept and then happens to have the
|
||
typical initializers.
|
||
|
||
This is annoying me mainly because I think the warning _is_ a good
|
||
warning, which is why I'm not just turning it off in disgust. But it is
|
||
hampered by this bad implementation detail.
|
||
|
||
[ And obviously I'm doing this now because system upgrades for me are
|
||
something that happen in the middle of the release cycle: don't do it
|
||
before or during travel, or just before or during the busy merge
|
||
window period. ]
|
||
|
||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||
---
|
||
Makefile | 3 +++
|
||
1 file changed, 3 insertions(+)
|
||
|
||
--- a/Makefile
|
||
+++ b/Makefile
|
||
@@ -1071,6 +1071,9 @@ KBUILD_CFLAGS += $(call cc-option, -fstr
|
||
KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-option, -Wno-stringop-overflow)
|
||
KBUILD_CFLAGS-$(CONFIG_CC_STRINGOP_OVERFLOW) += $(call cc-option, -Wstringop-overflow)
|
||
|
||
+#Currently, disable -Wunterminated-string-initialization as an error
|
||
+KBUILD_CFLAGS += $(call cc-option, -Wno-error=unterminated-string-initialization)
|
||
+
|
||
# disable invalid "can't wrap" optimizations for signed / pointers
|
||
KBUILD_CFLAGS += -fno-strict-overflow
|
||
|