[PATCH] D108003: [Clang] Extend -Wbool-operation to warn about bitwise and of bools with side effects
Nathan Chancellor via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 19 17:01:17 PDT 2021
nathanchance added a comment.
I am still running a series of builds against the Linux kernel but I already see one instance of this warning where the suggestion would change the meaning of the code in an incorrect way:
drivers/input/touchscreen.c:81:17: warning: use of bitwise '|' with boolean operands [-Wbool-operation]
data_present = touchscreen_get_prop_u32(dev, "touchscreen-min-x",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/input/touchscreen.c:81:17: warning: use of bitwise '|' with boolean operands [-Wbool-operation]
data_present = touchscreen_get_prop_u32(dev, "touchscreen-min-x",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/input/touchscreen.c:94:17: warning: use of bitwise '|' with boolean operands [-Wbool-operation]
data_present = touchscreen_get_prop_u32(dev, "touchscreen-min-y",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/input/touchscreen.c:94:17: warning: use of bitwise '|' with boolean operands [-Wbool-operation]
data_present = touchscreen_get_prop_u32(dev, "touchscreen-min-y",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/input/touchscreen.c:108:17: warning: use of bitwise '|' with boolean operands [-Wbool-operation]
data_present = touchscreen_get_prop_u32(dev,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 warnings generated.
Which corresponds to this file: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/input/touchscreen.c?h=v5.14-rc6
If the calls to `touchscreen_get_prop_u32` short circuit, we could use `maximum` or `fuzz` uninitialized. There might be a cleaner way to rewrite that block to avoid the warning but based on the other instances of this warning I see, I am not sure `|` vs. `||` is worth warning about (but I am happy to hear examples of how it could be a bug). Most people realize `&&` short circuits (as `if (a && foo(a->...))` is relatively common) but most probably are not thinking about `||` short circuiting (and it would be more of an optimization than correctness issue as far as I understand it).
Additionally, I have not caught any instances of `&` being used instead of `&&`, including the ones I notated previously; those were caught because only the right side had side effects. As was pointed out here and on the mailing list <https://lore.kernel.org/r/defb9e5133234835950c21511d776fb9@AcuMS.aculab.com/>, the `lib/zstd/` warning is probably a bug, as the short circuit should happen if `offset_1` is zero, otherwise there is unnecessary work done.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D108003/new/
https://reviews.llvm.org/D108003
More information about the cfe-commits
mailing list