I ran into strange behavior when using the Aztec linear system solver library. Using valgrind, I found out that this library does a memcpy
on overlapping buffers. Specification says that behavior of memcpy
on overlapping buffers is not defined.
It turns out that memcpy
on many machines has the same behavior as if you would do it with a for loop and therefore you can safely copy from a higher source to a lower destination:
for(int i = 0; i < len; i ++)
dest[i] = source[i];
BUT on our large cluster, memcpy
of overlapping buffers has a different behavior which leads to problems.
Now I wonder whether the overlapping memcpy
in the library is normal or just caused by another bug in my code. Since the library is widely used I assume that the memcpy
issue should have been discovered earlier. On the other hand, it's still possible that the vast majority of the memcpy
implementations behave like the for loop and therefore nobody ever encountered this problem.
- Can anyone tell me about his experiences with overlapping
memcpy
on various machines? - Which part of my computer system does actually provide
memcpy
?
I'd like to point out that question is about the practical experience with various implementations, not about what the specification says.