Commit 4169e889 authored by Gustavo A. R. Silva's avatar Gustavo A. R. Silva

include: jhash/signal: Fix fall-through warnings for Clang

In preparation to enable -Wimplicit-fallthrough for Clang, explicitly
add break statements instead of letting the code fall through to the
next case.

This patch adds four break statements that, together, fix almost 40,000
warnings when building Linux 5.10-rc1 with Clang 12.0.0 and this[1] change
reverted. Notice that in order to enable -Wimplicit-fallthrough for Clang,
such change[1] is meant to be reverted at some point. So, this patch helps
to move in that direction.

Something important to mention is that there is currently a discrepancy
between GCC and Clang when dealing with switch fall-through to empty case
statements or to cases that only contain a break/continue/return
statement[2][3][4].

Now that the -Wimplicit-fallthrough option has been globally enabled[5],
any compiler should really warn on missing either a fallthrough annotation
or any of the other case-terminating statements (break/continue/return/
goto) when falling through to the next case statement. Making exceptions
to this introduces variation in case handling which may continue to lead
to bugs, misunderstandings, and a general lack of robustness. The point
of enabling options like -Wimplicit-fallthrough is to prevent human error
and aid developers in spotting bugs before their code is even built/
submitted/committed, therefore eliminating classes of bugs. So, in order
to really accomplish this, we should, and can, move in the direction of
addressing any error-prone scenarios and get rid of the unintentional
fallthrough bug-class in the kernel, entirely, even if there is some minor
redundancy. Better to have explicit case-ending statements than continue to
have exceptions where one must guess as to the right result. The compiler
will eliminate any actual redundancy.

[1] commit e2079e93 ("kbuild: Do not enable -Wimplicit-fallthrough for clang for now")
[2] https://github.com/ClangBuiltLinux/linux/issues/636
[3] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91432
[4] https://godbolt.org/z/xgkvIh
[5] commit a035d552 ("Makefile: Globally enable fall-through warning")
Co-developed-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
parent 3650b228
...@@ -99,6 +99,7 @@ static inline u32 jhash(const void *key, u32 length, u32 initval) ...@@ -99,6 +99,7 @@ static inline u32 jhash(const void *key, u32 length, u32 initval)
case 2: a += (u32)k[1]<<8; fallthrough; case 2: a += (u32)k[1]<<8; fallthrough;
case 1: a += k[0]; case 1: a += k[0];
__jhash_final(a, b, c); __jhash_final(a, b, c);
break;
case 0: /* Nothing left to add */ case 0: /* Nothing left to add */
break; break;
} }
...@@ -136,6 +137,7 @@ static inline u32 jhash2(const u32 *k, u32 length, u32 initval) ...@@ -136,6 +137,7 @@ static inline u32 jhash2(const u32 *k, u32 length, u32 initval)
case 2: b += k[1]; fallthrough; case 2: b += k[1]; fallthrough;
case 1: a += k[0]; case 1: a += k[0];
__jhash_final(a, b, c); __jhash_final(a, b, c);
break;
case 0: /* Nothing left to add */ case 0: /* Nothing left to add */
break; break;
} }
......
...@@ -238,6 +238,7 @@ static inline void siginitset(sigset_t *set, unsigned long mask) ...@@ -238,6 +238,7 @@ static inline void siginitset(sigset_t *set, unsigned long mask)
memset(&set->sig[1], 0, sizeof(long)*(_NSIG_WORDS-1)); memset(&set->sig[1], 0, sizeof(long)*(_NSIG_WORDS-1));
break; break;
case 2: set->sig[1] = 0; case 2: set->sig[1] = 0;
break;
case 1: ; case 1: ;
} }
} }
...@@ -250,6 +251,7 @@ static inline void siginitsetinv(sigset_t *set, unsigned long mask) ...@@ -250,6 +251,7 @@ static inline void siginitsetinv(sigset_t *set, unsigned long mask)
memset(&set->sig[1], -1, sizeof(long)*(_NSIG_WORDS-1)); memset(&set->sig[1], -1, sizeof(long)*(_NSIG_WORDS-1));
break; break;
case 2: set->sig[1] = -1; case 2: set->sig[1] = -1;
break;
case 1: ; case 1: ;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment