You should really read through this thread (especially Linus Torvalds' comments)
I did, when the problem first hit. Linus is right for the code that he writes, in that the public APIs he is in charge of (the Linux kernel<->userspace boundary) does not have a normative public specification, is not designed to be re-implemented by multiple vendors (despite the BSDs impressive efforts), and, while the documentation (at least for syscalls) is generally pretty good, the only real definition in Linux of "what does this part of the API do?" is "whatever that part of the API currently does".
Linus' comments are dead right for the project he works on. However, he does not work on an implementation of The Standard C Library.
It is extremely unlikely that memcpy() outperforms memmove()
But ... that particular change to memcpy() wasn't made on a whim, for no reason. Rather, it was specifically made so that memcpy() could seriously outperform memmove(), because you can do extra optimisations if you know that the source and destination must not overlap!
the sane cleanup is just to add a new guarantee for a previously undefined usage of memcpy.
So convince ISO to change the standard, and the C libraries will follow. Including glibc.
Plus, I'm not convinced that strncpy() is a good example of a function that has "fix[ed] the brain damage". IMHO strncpy() is pretty brain damaged itself, and best avoided. strlcpy() is better, although not standardised, and not in glibc because of perfectly well-reasonsed arguments by Drepper. So I much prefer snprintf(dest, sizeof(dest), "%s", src);