Support the nonstring variable attribute (gcc >= 8)
PATCH v3 1/2 Support the nonstring variable attribute (gcc >= 8)
From the GCC manual:
The nonstring variable attribute specifies that an object or member declaration with type array of char, signed char, or unsigned char, or pointer to such a type is intended to store character arrays that do not necessarily contain a terminating NUL. This is useful in detecting uses of such arrays or pointers with functions that expect NUL-terminated strings, and to avoid warnings when such an array or pointer is used as an argument to a bounded string manipulation function such as strncpy.
https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html
Some reports are already coming to the LKML regarding these warnings. When they are false positives, like this one
https://lkml.org/lkml/2018/1/16/135
we can use __nonstring to let gcc know a NUL character is not required.
---
v3:
Moved #ifdef block to the bottom of the file as suggested by Joe. Updated description of the nonstring attribute in the patch and in the commit message from the GCC docs. Put all Cc people in both patches since the second is really an example of the first. Added Linus and Greg.
v2:
Re-sending this since a few months have passed, Martin has improved GCC's feature and warnings are appearing in Geert's build bot. Added an example in the second patch as requested by David.
include/linux/compiler-gcc.h | 15 +++++++++++++++ include/linux/compiler_types.h | 4 ++++ 2 files changed, 19 insertions(+)
include/linux/compiler-gcc.h +15 -0
@@ -387,3 +387,18 @@#else #define __diag_GCC_8 (s)#endif + +#if GCC_VERSION >=80000 +/* +* The nonstring variable attribute specifies that an object or member +* declaration with type array of char, signed char, or unsigned char, +* or pointer to such a type is intended to store character arrays that +* do not necessarily contain a terminating NUL. This is useful in detecting +* uses of such arrays or pointers with functions that expect NUL-terminated +* strings, and to avoid warnings when such an array or pointer is used as +* an argument to a bounded string manipulation function such as strncpy. +* +* https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html +*/ +#define __nonstring __attribute__((nonstring)) +#endif
include/linux/compiler_types.h +4 -0
@@ -289,4 +289,8 @@ struct ftrace_likely_data {#define __diag_error (compiler, version, option, comment) \ __diag_ ## compiler(version, error, option) +#ifndef __nonstring +# define __nonstring +#endif +#endif /* __LINUX_COMPILER_TYPES_H */
Signature · 1 line
2.17.1