* older gccs and case labels producing integer constants @ 2022-04-05 9:50 Borislav Petkov 2022-04-05 9:58 ` Richard Biener 2022-04-05 12:23 ` Peter Zijlstra 0 siblings, 2 replies; 16+ messages in thread From: Borislav Petkov @ 2022-04-05 9:50 UTC (permalink / raw) To: linux-toolchains; +Cc: Michael Matz, Richard Biener, lkml Hi folks, I'm starting to see failures like this on allmodconfig builds: sound/usb/midi.c: In function ‘snd_usbmidi_out_endpoint_create’: sound/usb/midi.c:1389:2: error: case label does not reduce to an integer constant case (((0xfc08) << 16) | (0x0101)): ^~~~ (The case statement is a macro but it evaluates to what I have there) and that thing fails with $ gcc --version gcc (SUSE Linux) 7.5.0 although it doesn't have any problems building with newer compilers. I'm presuming older gccs consider those case statements signed ints and the following fixes it: case ((((unsigned int)0xfc08) << 16) | (0x0101)): and I guess we can whack the couple of occurrences but what I'm wondering is why does this work with newer gccs? Thx. -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 9:50 older gccs and case labels producing integer constants Borislav Petkov @ 2022-04-05 9:58 ` Richard Biener 2022-04-05 10:04 ` Borislav Petkov 2022-04-05 10:06 ` Richard Biener 2022-04-05 12:23 ` Peter Zijlstra 1 sibling, 2 replies; 16+ messages in thread From: Richard Biener @ 2022-04-05 9:58 UTC (permalink / raw) To: Borislav Petkov; +Cc: linux-toolchains, Michael Matz, lkml [-- Attachment #1: Type: text/plain, Size: 1198 bytes --] On Tue, 5 Apr 2022, Borislav Petkov wrote: > Hi folks, > > I'm starting to see failures like this on allmodconfig builds: > > sound/usb/midi.c: In function ‘snd_usbmidi_out_endpoint_create’: > sound/usb/midi.c:1389:2: error: case label does not reduce to an integer constant > case (((0xfc08) << 16) | (0x0101)): > ^~~~ > > (The case statement is a macro but it evaluates to what I have there) > > and that thing fails with > > $ gcc --version > gcc (SUSE Linux) 7.5.0 > > although it doesn't have any problems building with newer compilers. > > I'm presuming older gccs consider those case statements signed ints and > the following fixes it: > > case ((((unsigned int)0xfc08) << 16) | (0x0101)): > > and I guess we can whack the couple of occurrences but what I'm > wondering is why does this work with newer gccs? I tried void foo (int i) { switch (i) { case (((0xfc08) << 16) | (0x0101)):; } } also with 'unsigned int i' but that's accepted with GCC 7. So what do you switch on? > Thx. > > -- Richard Biener <rguenther@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg) ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 9:58 ` Richard Biener @ 2022-04-05 10:04 ` Borislav Petkov 2022-04-05 10:06 ` Richard Biener 1 sibling, 0 replies; 16+ messages in thread From: Borislav Petkov @ 2022-04-05 10:04 UTC (permalink / raw) To: Richard Biener; +Cc: linux-toolchains, Michael Matz, lkml On Tue, Apr 05, 2022 at 11:58:33AM +0200, Richard Biener wrote: > also with 'unsigned int i' but that's accepted with GCC 7. So > what do you switch on? Ah, right, so it must be some of the gazillion switches. Below's a dump from building the asm version of that same file. Can you recognize which one might be causing this? # GNU C11 (SUSE Linux) version 7.5.0 (x86_64-suse-linux) # compiled by GNU C version 7.5.0, GMP version 6.1.2, MPFR version 4.0.2-p6, MPC version 1.1.0, isl version isl-0.18-GMP # GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 # options passed: -nostdinc -I ./arch/x86/include # -I ./arch/x86/include/generated -I ./include -I ./arch/x86/include/uapi # -I ./arch/x86/include/generated/uapi -I ./include/uapi # -I ./include/generated/uapi -D __KERNEL__ -D CC_USING_FENTRY -D MODULE # -D KBUILD_BASENAME="midi" -D KBUILD_MODNAME="snd_usbmidi_lib" # -D __KBUILD_MODNAME=kmod_snd_usbmidi_lib # -include ./include/linux/compiler-version.h # -include ./include/linux/kconfig.h # -include ./include/linux/compiler_types.h -MMD sound/usb/.midi.s.d # sound/usb/midi.c -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -m64 # -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 # -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel # -mindirect-branch=thunk-extern -mindirect-branch-register -mrecord-mcount # -mfentry -march=x86-64 -auxbase-strip sound/usb/midi.s -O2 -Wall -Wundef # -Werror=strict-prototypes -Wno-trigraphs # -Werror=implicit-function-declaration -Werror=implicit-int # -Werror=return-type -Wno-format-security -Wno-sign-compare # -Wno-frame-address -Wformat-truncation=0 -Wformat-overflow=0 # -Wframe-larger-than=2048 -Werror -Wimplicit-fallthrough=5 -Wno-main # -Wno-unused-but-set-variable -Wunused-const-variable=0 # -Wdeclaration-after-statement -Wvla -Wno-pointer-sign # -Wstringop-overflow=0 -Wno-restrict -Wno-maybe-uninitialized # -Werror=date-time -Werror=incompatible-pointer-types # -Werror=designated-init -std=gnu11 -p -fno-strict-aliasing -fno-common # -fshort-wchar -fno-PIE -falign-jumps=1 -falign-loops=1 # -fno-asynchronous-unwind-tables -fno-jump-tables # -fno-delete-null-pointer-checks -fno-reorder-blocks -fno-ipa-cp-clone # -fno-partial-inlining -fstack-protector-strong # -fno-stack-clash-protection -fno-inline-functions-called-once # -falign-functions=64 -fno-strict-overflow -fstack-check=no # -fconserve-stack -fsanitize=bounds -fsanitize=shift # -fsanitize=integer-divide-by-zero -fsanitize=bool -fsanitize=enum # -fsanitize-coverage=trace-pc -fverbose-asm # --param allow-store-data-races=0 # options enabled: -falign-labels -fauto-inc-dec -fbranch-count-reg # -fcaller-saves -fchkp-check-incomplete-type -fchkp-check-read # -fchkp-check-write -fchkp-instrument-calls -fchkp-narrow-bounds # -fchkp-optimize -fchkp-store-bounds -fchkp-use-static-bounds # -fchkp-use-static-const-bounds -fchkp-use-wrappers -fcode-hoisting # -fcombine-stack-adjustments -fcompare-elim -fcprop-registers # -fcrossjumping -fcse-follow-jumps -fdefer-pop -fdevirtualize # -fdevirtualize-speculatively -fdwarf2-cfi-asm -fearly-inlining # -feliminate-unused-debug-types -fexpensive-optimizations # -fforward-propagate -ffp-int-builtin-inexact -ffunction-cse -fgcse # -fgcse-lm -fgnu-runtime -fgnu-unique -fguess-branch-probability # -fhoist-adjacent-loads -fident -fif-conversion -fif-conversion2 # -findirect-inlining -finline -finline-atomics -finline-small-functions # -fipa-bit-cp -fipa-cp -fipa-icf -fipa-icf-functions -fipa-icf-variables # -fipa-profile -fipa-pure-const -fipa-reference # -fipa-reference-addressable -fipa-sra -fipa-stack-alignment -fipa-vrp # -fira-hoist-pressure -fira-share-save-slots -fira-share-spill-slots # -fisolate-erroneous-paths-dereference -fivopts -fkeep-static-consts # -fleading-underscore -flifetime-dse -flra-remat -flto-odr-type-merging # -fmath-errno -fmerge-constants -fmerge-debug-strings # -fmove-loop-invariants -fomit-frame-pointer -foptimize-sibling-calls # -foptimize-strlen -fpeephole -fpeephole2 -fplt -fprefetch-loop-arrays # -fprofile -free -freg-struct-return -freorder-functions # -frerun-cse-after-loop -fsanitize-coverage=trace-pc # -fsched-critical-path-heuristic -fsched-dep-count-heuristic # -fsched-group-heuristic -fsched-interblock -fsched-last-insn-heuristic # -fsched-rank-heuristic -fsched-spec -fsched-spec-insn-heuristic # -fsched-stalled-insns-dep -fschedule-fusion -fschedule-insns2 # -fsemantic-interposition -fshow-column -fshrink-wrap # -fshrink-wrap-separate -fsigned-zeros -fsplit-ivs-in-unroller # -fsplit-wide-types -fssa-backprop -fssa-phiopt -fstack-protector-strong # -fstdarg-opt -fstore-merging -fstrict-volatile-bitfields -fsync-libcalls # -fthread-jumps -ftoplevel-reorder -ftrapping-math -ftree-bit-ccp # -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-coalesce-vars # -ftree-copy-prop -ftree-cselim -ftree-dce -ftree-dominator-opts # -ftree-dse -ftree-forwprop -ftree-fre -ftree-loop-if-convert # -ftree-loop-im -ftree-loop-ivcanon -ftree-loop-optimize # -ftree-parallelize-loops= -ftree-phiprop -ftree-pre -ftree-pta # -ftree-reassoc -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra # -ftree-switch-conversion -ftree-tail-merge -ftree-ter -ftree-vrp # -funit-at-a-time -fverbose-asm -fzero-initialized-in-bss # -m128bit-long-double -m64 -malign-stringops -mavx256-split-unaligned-load # -mavx256-split-unaligned-store -mfentry -mfxsr -mglibc -mieee-fp # -mindirect-branch-register -mlong-double-80 -mno-fancy-math-387 # -mno-red-zone -mno-sse4 -mpush-args -mrecord-mcount -mskip-rax-setup # -mtls-direct-seg-refs -mvzeroupper -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 9:58 ` Richard Biener 2022-04-05 10:04 ` Borislav Petkov @ 2022-04-05 10:06 ` Richard Biener 2022-04-05 10:36 ` Borislav Petkov 1 sibling, 1 reply; 16+ messages in thread From: Richard Biener @ 2022-04-05 10:06 UTC (permalink / raw) To: Borislav Petkov; +Cc: linux-toolchains, Michael Matz, lkml [-- Attachment #1: Type: text/plain, Size: 1835 bytes --] On Tue, 5 Apr 2022, Richard Biener wrote: > On Tue, 5 Apr 2022, Borislav Petkov wrote: > > > Hi folks, > > > > I'm starting to see failures like this on allmodconfig builds: > > > > sound/usb/midi.c: In function ‘snd_usbmidi_out_endpoint_create’: > > sound/usb/midi.c:1389:2: error: case label does not reduce to an integer constant > > case (((0xfc08) << 16) | (0x0101)): > > ^~~~ > > > > (The case statement is a macro but it evaluates to what I have there) > > > > and that thing fails with > > > > $ gcc --version > > gcc (SUSE Linux) 7.5.0 > > > > although it doesn't have any problems building with newer compilers. > > > > I'm presuming older gccs consider those case statements signed ints and > > the following fixes it: > > > > case ((((unsigned int)0xfc08) << 16) | (0x0101)): > > > > and I guess we can whack the couple of occurrences but what I'm > > wondering is why does this work with newer gccs? > > I tried > > void foo (int i) > { > switch (i) > { > case (((0xfc08) << 16) | (0x0101)):; > } > } > > also with 'unsigned int i' but that's accepted with GCC 7. So > what do you switch on? Aha, also > gcc-7 -S t.c -std=c11 -pedantic -pedantic-errors t.c: In function 'foo': t.c:6:7: error: case label is not an integer constant expression [-Wpedantic] case USB_ID(0xfc08, 0x0101):; ^~~~ aber _nur_ mit -std=c11 (oder c99, aber nicht c89) und -pedantic -pedantic-errors. #define USB_ID(v,p) (((v)<<16)|(p)) void foo (unsigned int *i) { switch (*i) { case USB_ID(0xfc08, 0x0101):; } } Wird auch mit gcc 11 rejected. Kanns sein dass mit gcc 7 andere compiler flags genommen werden? -- Richard Biener <rguenther@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg) ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 10:06 ` Richard Biener @ 2022-04-05 10:36 ` Borislav Petkov 2022-04-05 10:45 ` Borislav Petkov ` (2 more replies) 0 siblings, 3 replies; 16+ messages in thread From: Borislav Petkov @ 2022-04-05 10:36 UTC (permalink / raw) To: Richard Biener; +Cc: linux-toolchains, Michael Matz, lkml On Tue, Apr 05, 2022 at 12:06:45PM +0200, Richard Biener wrote: > Wird auch mit gcc 11 rejected. Kanns sein dass mit gcc 7 andere > compiler flags genommen werden? Found it: $ gcc -fsanitize=shift -c switch.c switch.c: In function ‘foo’: switch.c:10:7: error: case label does not reduce to an integer constant case (((0xfc08) << 16) | (0x0101)):; $ gcc --version gcc (SUSE Linux) 7.4.1 20190905 [gcc-7-branch revision 275407] Copyright (C) 2017 Free Software Foundation, Inc. Something not fully backported? Thx. -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 10:36 ` Borislav Petkov @ 2022-04-05 10:45 ` Borislav Petkov 2022-04-05 11:41 ` Richard Biener 2022-04-05 11:37 ` Richard Biener 2022-04-06 9:53 ` Jakub Jelinek 2 siblings, 1 reply; 16+ messages in thread From: Borislav Petkov @ 2022-04-05 10:45 UTC (permalink / raw) To: Richard Biener; +Cc: linux-toolchains, Michael Matz, lkml On Tue, Apr 05, 2022 at 12:36:58PM +0200, Borislav Petkov wrote: > On Tue, Apr 05, 2022 at 12:06:45PM +0200, Richard Biener wrote: > > Wird auch mit gcc 11 rejected. Kanns sein dass mit gcc 7 andere > > compiler flags genommen werden? > > Found it: > > $ gcc -fsanitize=shift -c switch.c > switch.c: In function ‘foo’: > switch.c:10:7: error: case label does not reduce to an integer constant > case (((0xfc08) << 16) | (0x0101)):; > > $ gcc --version > gcc (SUSE Linux) 7.4.1 20190905 [gcc-7-branch revision 275407] > Copyright (C) 2017 Free Software Foundation, Inc. > > Something not fully backported? Ok, not really: gcc-10 -fsanitize=shift -c switch.c switch.c: In function ‘foo’: switch.c:10:7: error: case label does not reduce to an integer constant 10 | case (((0xfc08) << 16) | (0x0101)):; | ^~~~ BUT! when more switches are set with gcc-10 (full gcc cmdline from a kernel build), then that passes. But it doesn't pass with gcc-7. Weird... -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 10:45 ` Borislav Petkov @ 2022-04-05 11:41 ` Richard Biener 2022-04-07 15:16 ` Borislav Petkov 0 siblings, 1 reply; 16+ messages in thread From: Richard Biener @ 2022-04-05 11:41 UTC (permalink / raw) To: Borislav Petkov; +Cc: linux-toolchains, Michael Matz, lkml [-- Attachment #1: Type: text/plain, Size: 1381 bytes --] On Tue, 5 Apr 2022, Borislav Petkov wrote: > On Tue, Apr 05, 2022 at 12:36:58PM +0200, Borislav Petkov wrote: > > On Tue, Apr 05, 2022 at 12:06:45PM +0200, Richard Biener wrote: > > > Wird auch mit gcc 11 rejected. Kanns sein dass mit gcc 7 andere > > > compiler flags genommen werden? > > > > Found it: > > > > $ gcc -fsanitize=shift -c switch.c > > switch.c: In function ‘foo’: > > switch.c:10:7: error: case label does not reduce to an integer constant > > case (((0xfc08) << 16) | (0x0101)):; > > > > $ gcc --version > > gcc (SUSE Linux) 7.4.1 20190905 [gcc-7-branch revision 275407] > > Copyright (C) 2017 Free Software Foundation, Inc. > > > > Something not fully backported? > > Ok, not really: > > gcc-10 -fsanitize=shift -c switch.c > switch.c: In function ‘foo’: > switch.c:10:7: error: case label does not reduce to an integer constant > 10 | case (((0xfc08) << 16) | (0x0101)):; > | ^~~~ > > BUT! > > when more switches are set with gcc-10 (full gcc cmdline from a kernel > build), then that passes. > > But it doesn't pass with gcc-7. > > Weird... As was noted in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66880 this is invalid C99+ but compilers are not required to diagnose that (you get it diagnosed with -pedantic). -fsanitize=shift exposes it though since the non-integral-constant gets instrumented. Richard. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 11:41 ` Richard Biener @ 2022-04-07 15:16 ` Borislav Petkov 0 siblings, 0 replies; 16+ messages in thread From: Borislav Petkov @ 2022-04-07 15:16 UTC (permalink / raw) To: Richard Biener; +Cc: linux-toolchains, Michael Matz, lkml On Tue, Apr 05, 2022 at 01:41:09PM +0200, Richard Biener wrote: > As was noted in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66880 > this is invalid C99+ but compilers are not required to diagnose that > (you get it diagnosed with -pedantic). -fsanitize=shift exposes > it though since the non-integral-constant gets instrumented. Right, just to close this: I was still unsure which of the cmdline options would cause it and bisected the kernel (big fat box can build allmodconfigs in no time :)). The single change which fixes the whole build is --- diff --git a/Makefile b/Makefile index 8c7de9a72ea2..3582089cfeb6 100644 --- a/Makefile +++ b/Makefile @@ -523,7 +523,7 @@ KBUILD_CFLAGS := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \ -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \ -Werror=implicit-function-declaration -Werror=implicit-int \ -Werror=return-type -Wno-format-security \ - -std=gnu11 + -std=gnu89 KBUILD_CPPFLAGS := -D__KERNEL__ KBUILD_AFLAGS_KERNEL := KBUILD_CFLAGS_KERNEL := with that gcc (SUSE Linux) 7.4.1 20190905 [gcc-7-branch revision 275407] but as we saw, only -std=gnu11 alone doesn't cause it: $ gcc -std=gnu11 -o switch.o switch.c $ And so we had the -fsanitize=shift already enabled since 2020 in the kernel build and the gnu11 change then triggered the undefined behavior due to the -fsanitize instrumentation as it was already explained: $ gcc -std=gnu11 -fsanitize=shift -o switch.o switch.c switch.c: In function ‘foo’: switch.c:10:7: error: case label does not reduce to an integer constant case (((0xfc08) << 16) | (0x0101)):; ^~~~ Ok, now I can sleep at night again. :-))) -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 10:36 ` Borislav Petkov 2022-04-05 10:45 ` Borislav Petkov @ 2022-04-05 11:37 ` Richard Biener 2022-04-06 9:53 ` Jakub Jelinek 2 siblings, 0 replies; 16+ messages in thread From: Richard Biener @ 2022-04-05 11:37 UTC (permalink / raw) To: Borislav Petkov; +Cc: linux-toolchains, Michael Matz, lkml [-- Attachment #1: Type: text/plain, Size: 865 bytes --] On Tue, 5 Apr 2022, Borislav Petkov wrote: > On Tue, Apr 05, 2022 at 12:06:45PM +0200, Richard Biener wrote: > > Wird auch mit gcc 11 rejected. Kanns sein dass mit gcc 7 andere > > compiler flags genommen werden? > > Found it: > > $ gcc -fsanitize=shift -c switch.c > switch.c: In function ‘foo’: > switch.c:10:7: error: case label does not reduce to an integer constant > case (((0xfc08) << 16) | (0x0101)):; > > $ gcc --version > gcc (SUSE Linux) 7.4.1 20190905 [gcc-7-branch revision 275407] > Copyright (C) 2017 Free Software Foundation, Inc. > > Something not fully backported? Probably early vs. late folding change in the frontend. So yes, don't use -fsanitize=... ;) Richard. -- Richard Biener <rguenther@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg) ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 10:36 ` Borislav Petkov 2022-04-05 10:45 ` Borislav Petkov 2022-04-05 11:37 ` Richard Biener @ 2022-04-06 9:53 ` Jakub Jelinek 2022-04-06 10:04 ` Jakub Jelinek 2 siblings, 1 reply; 16+ messages in thread From: Jakub Jelinek @ 2022-04-06 9:53 UTC (permalink / raw) To: Borislav Petkov; +Cc: Richard Biener, linux-toolchains, Michael Matz, lkml On Tue, Apr 05, 2022 at 12:36:58PM +0200, Borislav Petkov wrote: > On Tue, Apr 05, 2022 at 12:06:45PM +0200, Richard Biener wrote: > > Wird auch mit gcc 11 rejected. Kanns sein dass mit gcc 7 andere > > compiler flags genommen werden? > > Found it: > > $ gcc -fsanitize=shift -c switch.c > switch.c: In function ‘foo’: > switch.c:10:7: error: case label does not reduce to an integer constant > case (((0xfc08) << 16) | (0x0101)):; > > $ gcc --version > gcc (SUSE Linux) 7.4.1 20190905 [gcc-7-branch revision 275407] > Copyright (C) 2017 Free Software Foundation, Inc. > > Something not fully backported? That is rejected with -fsanitize=shift even on current trunk (in C, C++ is fine). C++ constexpr code has cases for ubsan builtins and internal functions, but C just doesn't handle those apparently. Jakub ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-06 9:53 ` Jakub Jelinek @ 2022-04-06 10:04 ` Jakub Jelinek 0 siblings, 0 replies; 16+ messages in thread From: Jakub Jelinek @ 2022-04-06 10:04 UTC (permalink / raw) To: Borislav Petkov, Richard Biener, linux-toolchains, Michael Matz, lkml On Wed, Apr 06, 2022 at 11:53:17AM +0200, Jakub Jelinek wrote: > On Tue, Apr 05, 2022 at 12:36:58PM +0200, Borislav Petkov wrote: > > On Tue, Apr 05, 2022 at 12:06:45PM +0200, Richard Biener wrote: > > > Wird auch mit gcc 11 rejected. Kanns sein dass mit gcc 7 andere > > > compiler flags genommen werden? > > > > Found it: > > > > $ gcc -fsanitize=shift -c switch.c > > switch.c: In function ‘foo’: > > switch.c:10:7: error: case label does not reduce to an integer constant > > case (((0xfc08) << 16) | (0x0101)):; > > > > $ gcc --version > > gcc (SUSE Linux) 7.4.1 20190905 [gcc-7-branch revision 275407] > > Copyright (C) 2017 Free Software Foundation, Inc. > > > > Something not fully backported? > > That is rejected with -fsanitize=shift even on current trunk (in C, C++ is > fine). > C++ constexpr code has cases for ubsan builtins and internal functions, > but C just doesn't handle those apparently. But I think the error is actually correct. In C99 and later, for signed left shift the rule for x << y is that there is UB if (similarly to all C family) if y is negative or greater or equal to precision of promoted x, but for C99 also when ((unsigned_typeof_x) x >> (precision_of_x - 1 - y)) != 0. That is the case above, 0xfc08 is signed int and 0xfc08 << 16 is 0xfc080000 where (0xfc08 >> 15) is 1 and so it is UB. In C99 and later you need: case (int)(((0xfc08U) << 16) | (0x0101)):; or so. Note, C++ has different rules (and C++20 and later only has the y non-negative and less than precision requirement and nothing else). Jakub ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 9:50 older gccs and case labels producing integer constants Borislav Petkov 2022-04-05 9:58 ` Richard Biener @ 2022-04-05 12:23 ` Peter Zijlstra 2022-04-05 12:39 ` Michael Matz 2022-04-06 10:13 ` Jakub Jelinek 1 sibling, 2 replies; 16+ messages in thread From: Peter Zijlstra @ 2022-04-05 12:23 UTC (permalink / raw) To: Borislav Petkov; +Cc: linux-toolchains, Michael Matz, Richard Biener, lkml On Tue, Apr 05, 2022 at 11:50:35AM +0200, Borislav Petkov wrote: > Hi folks, > > I'm starting to see failures like this on allmodconfig builds: > > sound/usb/midi.c: In function ‘snd_usbmidi_out_endpoint_create’: > sound/usb/midi.c:1389:2: error: case label does not reduce to an integer constant > case (((0xfc08) << 16) | (0x0101)): > ^~~~ > > (The case statement is a macro but it evaluates to what I have there) > > and that thing fails with > > $ gcc --version > gcc (SUSE Linux) 7.5.0 > > although it doesn't have any problems building with newer compilers. > > I'm presuming older gccs consider those case statements signed ints and > the following fixes it: > > case ((((unsigned int)0xfc08) << 16) | (0x0101)): > > and I guess we can whack the couple of occurrences but what I'm > wondering is why does this work with newer gccs? IIRC GCC-8 fixed a bunch of -wrapv issues. Could be this is one of them I suppose. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 12:23 ` Peter Zijlstra @ 2022-04-05 12:39 ` Michael Matz 2022-04-05 12:53 ` Richard Biener 2022-04-06 10:13 ` Jakub Jelinek 1 sibling, 1 reply; 16+ messages in thread From: Michael Matz @ 2022-04-05 12:39 UTC (permalink / raw) To: Peter Zijlstra; +Cc: Borislav Petkov, linux-toolchains, Richard Biener, lkml [-- Attachment #1: Type: text/plain, Size: 752 bytes --] Hey, On Tue, 5 Apr 2022, Peter Zijlstra wrote: > > sound/usb/midi.c: In function ‘snd_usbmidi_out_endpoint_create’: > > sound/usb/midi.c:1389:2: error: case label does not reduce to an integer constant > > case (((0xfc08) << 16) | (0x0101)): > > ^~~~ > > IIRC GCC-8 fixed a bunch of -wrapv issues. Could be this is one of them > I suppose. Or better said, later GCCs returned back to the old behaviour of rejecting this only with -pedantic even in the presence of -fsanitize. But pedantically speaking (ahem!) it really isn't conforming c99 (which the compilation flags claim) , and in this case it seems easy enough to make the construct actually be conforming in the kernel sources, so that should perhaps be done? Ciao, Michael. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 12:39 ` Michael Matz @ 2022-04-05 12:53 ` Richard Biener 2022-04-05 13:04 ` Borislav Petkov 0 siblings, 1 reply; 16+ messages in thread From: Richard Biener @ 2022-04-05 12:53 UTC (permalink / raw) To: Michael Matz; +Cc: Peter Zijlstra, Borislav Petkov, linux-toolchains, lkml [-- Attachment #1: Type: text/plain, Size: 1390 bytes --] On Tue, 5 Apr 2022, Michael Matz wrote: > Hey, > > On Tue, 5 Apr 2022, Peter Zijlstra wrote: > > > > sound/usb/midi.c: In function ‘snd_usbmidi_out_endpoint_create’: > > > sound/usb/midi.c:1389:2: error: case label does not reduce to an integer constant > > > case (((0xfc08) << 16) | (0x0101)): > > > ^~~~ > > > > IIRC GCC-8 fixed a bunch of -wrapv issues. Could be this is one of them > > I suppose. > > Or better said, later GCCs returned back to the old behaviour of rejecting > this only with -pedantic even in the presence of -fsanitize. Only that it doesn't: #define USB_ID(v,p) (((v)<<16)|(p)) void foo (unsigned int *i) { switch (*i) { case USB_ID(0xfc08, 0x0101):; } } > gcc-11 -S t.c -std=c99 -fsanitize=shift t.c: In function 'foo': t.c:6:7: error: case label does not reduce to an integer constant 6 | case USB_ID(0xfc08, 0x0101):; | ^~~~ for some reason it might fail to sanitize the case label for the full testcase but clearly it doesn't so on purpose. > But > pedantically speaking (ahem!) it really isn't conforming c99 (which the > compilation flags claim) , and in this case it seems easy enough to make > the construct actually be conforming in the kernel sources, so that should > perhaps be done? Indeed. Simply cast vendor/product to (unsigned) in the USB_ID macro to avoid arithmetic shifts. Richard. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 12:53 ` Richard Biener @ 2022-04-05 13:04 ` Borislav Petkov 0 siblings, 0 replies; 16+ messages in thread From: Borislav Petkov @ 2022-04-05 13:04 UTC (permalink / raw) To: Richard Biener; +Cc: Michael Matz, Peter Zijlstra, linux-toolchains, lkml On Tue, Apr 05, 2022 at 02:53:18PM +0200, Richard Biener wrote: > Indeed. Simply cast vendor/product to (unsigned) in the USB_ID > macro to avoid arithmetic shifts. Yeah, Boris is going to turn on his editor and do patches... :-) Thx guys! -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: older gccs and case labels producing integer constants 2022-04-05 12:23 ` Peter Zijlstra 2022-04-05 12:39 ` Michael Matz @ 2022-04-06 10:13 ` Jakub Jelinek 1 sibling, 0 replies; 16+ messages in thread From: Jakub Jelinek @ 2022-04-06 10:13 UTC (permalink / raw) To: Peter Zijlstra Cc: Borislav Petkov, linux-toolchains, Michael Matz, Richard Biener, lkml On Tue, Apr 05, 2022 at 02:23:31PM +0200, Peter Zijlstra wrote: > On Tue, Apr 05, 2022 at 11:50:35AM +0200, Borislav Petkov wrote: > > Hi folks, > > > > I'm starting to see failures like this on allmodconfig builds: > > > > sound/usb/midi.c: In function ‘snd_usbmidi_out_endpoint_create’: > > sound/usb/midi.c:1389:2: error: case label does not reduce to an integer constant > > case (((0xfc08) << 16) | (0x0101)): > > ^~~~ > > > > (The case statement is a macro but it evaluates to what I have there) > > > > and that thing fails with > > > > $ gcc --version > > gcc (SUSE Linux) 7.5.0 > > > > although it doesn't have any problems building with newer compilers. > > > > I'm presuming older gccs consider those case statements signed ints and > > the following fixes it: > > > > case ((((unsigned int)0xfc08) << 16) | (0x0101)): > > > > and I guess we can whack the couple of occurrences but what I'm > > wondering is why does this work with newer gccs? > > IIRC GCC-8 fixed a bunch of -wrapv issues. Could be this is one of them > I suppose. If we are talking about -fsanitize=shift -fwrapv, then that is https://gcc.gnu.org/PR68418 , i.e. it was fixed already for GCC 6. Jakub ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2022-04-07 15:16 UTC | newest] Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-04-05 9:50 older gccs and case labels producing integer constants Borislav Petkov 2022-04-05 9:58 ` Richard Biener 2022-04-05 10:04 ` Borislav Petkov 2022-04-05 10:06 ` Richard Biener 2022-04-05 10:36 ` Borislav Petkov 2022-04-05 10:45 ` Borislav Petkov 2022-04-05 11:41 ` Richard Biener 2022-04-07 15:16 ` Borislav Petkov 2022-04-05 11:37 ` Richard Biener 2022-04-06 9:53 ` Jakub Jelinek 2022-04-06 10:04 ` Jakub Jelinek 2022-04-05 12:23 ` Peter Zijlstra 2022-04-05 12:39 ` Michael Matz 2022-04-05 12:53 ` Richard Biener 2022-04-05 13:04 ` Borislav Petkov 2022-04-06 10:13 ` Jakub Jelinek
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.