Am 24.06.2022 um 13:33 schrieb Taylor R Campbell:
On powerpc, char is unsigned, so the code char *stddt; int hash; ... hash = 0; for(j=0; stddt[j]; j++){ hash = hash*53 + stddt[j]; } computes sums and products of nonnegative quantities in (signed) int arithmetic, in which overflow is undefined behaviour. gcc may deduce that the value of hash must lie in the interval [0, INT_MAX] = [0, 0x7fffffff], under which premise the expression `hash & 0x7fffffff' can be correctly replaced by `hash'.
I reproduced it on Godbolt's Compiler Explorer, thanks for the explanation. I briefly thought about adding a check for this case to NetBSD's lint. Since 2022-05-26, lint tracks the possible values of integer expressions, and this integer overflow would be a perfect fit for it. But then I noticed that lint only tracks the possible values in a single expression, it does not track them through a whole function. Adding that would be possible but non-trivial. Which other static analysis tool can detect this kind of bug? Running GCC with -Woverflow doesn't print anything.