Compiling kernel with -Wformat-signedness gcc flag
Hello everyone, I just compiled the kernel by passing "-Wformat-signedness" flag https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html -Wformat-signedness: If -Wformat is specified, also warn if the format string requires an unsigned argument and the argument is signed and vice versa. Now, the C standard says: "If a conversion specification is invalid, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is *undefined*." For eg: drivers/iio/trigger/stm32-timer-trigger.c:228:24: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘unsigned int’ [-Wformat=] return sprintf(buf, "%d\n", (unsigned int)freq); ~^ ~~~~~~~~~~~~~~~~~~ %d What is the rationale for not including/using this flag in the HOSTCFLAGS in the Makefile ? -- Thanks Himanshu Jha
On Fri, Mar 9, 2018 at 8:16 AM, Himanshu Jha <himanshujha199640@gmail.com> wrote:
Hello everyone,
I just compiled the kernel by passing "-Wformat-signedness" flag
https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-Wformat-signedness: If -Wformat is specified, also warn if the format string requires an unsigned argument and the argument is signed and vice versa.
Now, the C standard says:
"If a conversion specification is invalid, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is *undefined*."
For eg:
drivers/iio/trigger/stm32-timer-trigger.c:228:24: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘unsigned int’ [-Wformat=] return sprintf(buf, "%d\n", (unsigned int)freq); ~^ ~~~~~~~~~~~~~~~~~~ %d
What is the rationale for not including/using this flag in the HOSTCFLAGS in the Makefile ?
In the past, it was posited the toolchain should be smart enough to know when the programmer intended/needed a signed value versus an unsigned one. Also see http://linux.derkeiler.com/Mailing-Lists/Kernel/2006-11/msg08325.html. Jeff
Hi Jeff, On Fri, Mar 9, 2018 at 2:24 PM, Jeffrey Walton <noloader@gmail.com> wrote:
On Fri, Mar 9, 2018 at 8:16 AM, Himanshu Jha <himanshujha199640@gmail.com> wrote:
Hello everyone,
I just compiled the kernel by passing "-Wformat-signedness" flag
https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-Wformat-signedness: If -Wformat is specified, also warn if the format string requires an unsigned argument and the argument is signed and vice versa.
Now, the C standard says:
"If a conversion specification is invalid, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is *undefined*."
For eg:
drivers/iio/trigger/stm32-timer-trigger.c:228:24: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘unsigned int’ [-Wformat=] return sprintf(buf, "%d\n", (unsigned int)freq); ~^ ~~~~~~~~~~~~~~~~~~ %d
What is the rationale for not including/using this flag in the HOSTCFLAGS in the Makefile ?
In the past, it was posited the toolchain should be smart enough to know when the programmer intended/needed a signed value versus an unsigned one. Also see http://linux.derkeiler.com/Mailing-Lists/Kernel/2006-11/msg08325.html.
I am not sure this is best example why this flag is not used anymore. I can see that type-limits is being used. It is even a -Werror=type-limits when compiling with W=1. Anyway I see your point, just that the example may be a bit out dated.
participants (3)
-
Himanshu Jha -
Jeffrey Walton -
Mathieu Malaterre