From: Valentine Krasnobaeva Date: Mon, 31 Mar 2025 09:47:45 +0000 (+0200) Subject: MINOR: compiler: add __nonstring macro X-Git-Tag: v3.0.12~115 X-Git-Url: http://git.haproxy.org/?a=commitdiff_plain;h=77cd566756233ea6618bfa851073dd16c9a04f9c;p=haproxy-3.0.git MINOR: compiler: add __nonstring macro GCC 15 throws the following warning on fixed-size char arrays if they do not contain terminated NUL: src/tools.c:2041:25: error: initializer-string for array of 'char' truncates NUL terminator but destination lacks 'nonstring' attribute (17 chars into 16 available) [-Werror=unterminated-string-initialization] 2041 | const char hextab[16] = "0123456789ABCDEF"; We are using a couple of such definitions for some constants. Converting them to flexible arrays, like: hextab[] = "0123456789ABCDEF" may have consequences, as enlarged arrays won't fit anymore where they were possibly located due to the memory alignement constraints. GCC adds 'nonstring' variable attribute for such char arrays, but clang and other compilers don't have it. Let's wrap 'nonstring' with our __nonstring macro, which will test if the compiler supports this attribute. This fixes the issue #2910. (cherry picked from commit b3038614696fee43b6eaa826f47f273a8619690d) [wla: should be backported to every stable branches] Signed-off-by: William Lallemand (cherry picked from commit d4234b3c32b79b8dffd70f22c1eb3ba39541acb3) Signed-off-by: William Lallemand --- diff --git a/include/haproxy/compiler.h b/include/haproxy/compiler.h index d17be99..35ebd49 100644 --- a/include/haproxy/compiler.h +++ b/include/haproxy/compiler.h @@ -483,4 +483,15 @@ #define __has_feature(x) 0 #endif +/* gcc 15 throws warning if fixed-size char array does not contain a terminating + * NUL. gcc has an attribute 'nonstring', which allows to suppress this warning + * for such array declarations. But it's not the case for clang and other + * compilers. + */ +#if __has_attribute(nonstring) +#define __nonstring __attribute__ ((nonstring)) +#else +#define __nonstring +#endif + #endif /* _HAPROXY_COMPILER_H */ diff --git a/src/tools.c b/src/tools.c index 74be4ad..a294fe3 100644 --- a/src/tools.c +++ b/src/tools.c @@ -64,6 +64,7 @@ extern void *__elf_aux_vector; #include #include #include +#include #include #include #include @@ -1980,7 +1981,7 @@ int addr_is_local(const struct netns_entry *ns, * * Return the address of the \0 character, or NULL on error */ -const char hextab[16] = "0123456789ABCDEF"; +const char hextab[16] __nonstring = "0123456789ABCDEF"; char *encode_string(char *start, char *stop, const char escape, const long *map, const char *string)