There is a longer discussion on stack overflow:
https://stackoverflow.com/questions/6702161/pointer-comparisons-in-c-are-the...
See the remarks about "comparison of pointers belonging to different objects".
See also the remark in the LLVM ticket from 'nikic' about the overflow being the same case of undefined behavior. IMO this makes sense: If we add a huge offset to a pointer triggering an overflow, the compiler may indeed assume that the result does not point to the same object as the original pointer.
Kind regards,
Frank
On Dienstag, 7. Januar 2025 13:29:33 MEZ Kjetil Oftedal wrote:
Hi,
Can you point to where in the C standard this is treated as undefined behavior?
Best regards, Kjetil Oftedal
On Tue, 7 Jan 2025 at 13:10, Marcus Haehnel marcus.haehnel@kernkonzept.com wrote:
From: Frank Mehnert frank.mehnert@kernkonzept.com
It is undefined behavior to compare two pointers belonging to different objects. This includes the case where the addition overflows. Clang-20 seems to follow this rule more eagerly and optimizes away the old test.
Fix the test by performing the addition on uintptr_t values rather than on on char pointers.
See also https://github.com/llvm/llvm-project/issues/121909.
Signed-off-by: Marcus Haehnel marcus.haehnel@kernkonzept.com
libc/string/generic/strnlen.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/libc/string/generic/strnlen.c b/libc/string/generic/strnlen.c index 4d4cde84f..82d4122ec 100644 --- a/libc/string/generic/strnlen.c +++ b/libc/string/generic/strnlen.c @@ -29,15 +29,17 @@ '\0' terminator is found in that many characters, return MAXLEN. */ size_t strnlen (const char *str, size_t maxlen) {
- const char *char_ptr, *end_ptr = str + maxlen;
const char *char_ptr, *end_ptr; const unsigned long int *longword_ptr; unsigned long int longword, himagic, lomagic;
if (maxlen == 0) return 0;
- if (__builtin_expect (end_ptr < str, 0))
if (__builtin_expect ((uintptr_t)str + maxlen < (uintptr_t)str, 0)) end_ptr = (const char *) ~0UL;
else
end_ptr = str + maxlen;
/* Handle the first few characters by reading one character at a time. Do this until CHAR_PTR is aligned on a longword boundary. */
-- 2.47.1
devel mailing list -- devel@uclibc-ng.org To unsubscribe send an email to devel-leave@uclibc-ng.org