Lasse Collin wrote on 2026-08-03: > (Actually, memmove(NULL, ptr, 0) executes ptr < > NULL, which is still undefined. It's an obsolete module though.)
Fixing it like this: 2026-08-15 Bruno Haible <[email protected]> memmove: Avoid undefined behaviour upon memmove (NULL, ptr, 0). Reported by Lasse Collin in <https://lists.gnu.org/archive/html/bug-gnulib/2026-08/msg00096.html>. * lib/memmove.c (memmove): Test for length==0 case early. diff --git a/lib/memmove.c b/lib/memmove.c index 0d80de69c2..e7b17f6335 100644 --- a/lib/memmove.c +++ b/lib/memmove.c @@ -12,17 +12,26 @@ void * memmove (void *dest0, void const *source0, size_t length) { - char *dest = dest0; - char const *source = source0; - if (source < dest) - /* Moving from low mem to hi mem; start at end. */ - for (source += length, dest += length; length; --length) - *--dest = *--source; - else if (source != dest) + if (length > 0) { - /* Moving from hi mem to low mem; start at beginning. */ - for (; length; --length) - *dest++ = *source++; + char *dest = dest0; + char const *source = source0; + if (source < dest) + { + /* Moving from low mem to hi mem; start at end. */ + source += length; + dest += length; + do + *--dest = *--source; + while (--length > 0); + } + else if (source != dest) + { + /* Moving from hi mem to low mem; start at beginning. */ + do + *dest++ = *source++; + while (--length > 0); + } } return dest0; }
