| Valgrind 3.3 - Advanced Debugging and Profiling for GNU/Linux applications by J. Seward, N. Nethercote, J. Weidendorfer and the Valgrind Development Team Paperback (6"x9"), 164 pages ISBN 0954612051 RRP £12.95 ($19.95) |
5.3.6 Overlapping source and destination blocks
The following C library functions copy some data from one
memory block to another (or something similar):
memcpy(),
strcpy(),
strncpy(),
strcat(),
strncat().
The blocks pointed to by their ‘src’ and
‘dst’ pointers aren't allowed to overlap.
Memcheck checks for this.
For example:
==27492== Source and destination overlap in
memcpy(0xbffff294, 0xbffff280, 21)
==27492== at 0x40026CDC: memcpy
(mc_replace_strmem.c:71)
==27492== by 0x804865A: main (overlap.c:40)
You don't want the two blocks to overlap because one of them could get partially overwritten by the copying.
You might think that Memcheck is being overly pedantic reporting
this in the case where ‘dst’ is less than
‘src’. For example, the obvious way to
implement memcpy() is by copying from the first
byte to the last. However, the optimisation guides of some
architectures recommend copying from the last byte down to the first.
Also, some implementations of memcpy() zero
‘dst’ before copying, because zeroing the
destination's cache line(s) can improve performance.
In addition, for many of these functions, the POSIX standards have wording along the lines “If copying takes place between objects that overlap, the behavior is undefined.” Hence overlapping copies violate the standard.
The moral of the story is: if you want to write truly portable code, don't make any assumptions about the language implementation.
| ISBN 0954612051 | Valgrind 3.3 - Advanced Debugging and Profiling for GNU/Linux applications | See the print edition |