On Sun, Nov 09, 2025 at 08:11:09PM +0100, Vlastimil Babka wrote:
> Pointer arthemitic with 'void * addr' and 'unsigned long long dest_alignment' > triggers following warning: > > mremap_test.c:1035:31: warning: pointer comparison always evaluates to > false [-Wtautological-compare] > 1035 | if (addr + c.dest_alignment < addr) { > | ^ > > typecasting 'addr' to 'unsigned long long' to fix pointer comparison.
...
I must say, applying this would be an unhappy life event.
if (void* + ulong < void*)
makes perfect sense in a world which permits void* arithmetic (ie, ours). So what the heck is clang doing??
My (not very informed) guess would be something about undefined behavior because pointer arithmetic is strictly speaking only valid within an array, so void* + ulong is also still in the same array, and thus can't become smaller by an overflow, because overflow can't happen if we're still within the same valid array...
It is indeed due to undefined behavior but more so that without -fwrapv-pointer (set via -fno-strict-overflow for the kernel build), the addition of an unsigned index and a pointer cannot wrap. This warning is a result of the following change in clang-20:
https://github.com/llvm/llvm-project/commit/6d34cfac53b993a6cdf3d6669e017eac... https://godbolt.org/z/hvMoPYb17
which I made sure respected the value of -fwrapv-pointer in
https://github.com/llvm/llvm-project/commit/f0dcf3240dffe3767c7f3a2e2da5b92a...
But it looks like the mm selftests do not build with -fno-strict-overflow. Maybe it should?
But I don't know if this strictness is only applied to the warning itself or to the actual compilation too (does it eliminate everything as dead code then?)
Yes, it would turn that
if (addr + c.dest_alignment < addr) {
into just
if (false) {
based on the above Godbolt link.
If we do
void *addr2 = addr + c.dest_alignment; if (addr2 < addr) ...
then which statement warns, and why?
As the answer was that nothing warns, I'd think it just isn't able to warn if it's no longer part of the same statement. Whether it also means it's not eliminated as dead code anymore, dunno.
Based on the above Godbolt link, it appears it will be optimized the same way, just without the warning letting you know something is up.
Cheers, Nathan