Valgrind Warning: Should I Take It Seriously

c, overlap, strcpy, valgrind

Solution

Probably the standard does not specify what happens when these buffers overlap. So yes, `valgrind` is right to complain about this.

In practical terms you will most likely find that your `strcpy` copies in order from left-to-right (eg. `while (*dst++ = *src++);`) and that it's not an issue. But it it still incorrect and may have issues when running with other C libraries.

One standards-correct way to write this would be:

memmove(newBuff, newBuff+1, strlen(newBuff));

Because `memmove` is defined to handle overlap. (Although here you would end up traversing the string twice, once to check the length and once to copy. I also took a shortcut, since `strlen(newBuff)` should equal `strlen(newBuff+1)+1`, which is what I originally wrote.)

Problem

Background: I have a small routine that mimics `fgets(character, 2, fp)` except it takes a character from a string instead of a stream. newBuff is dynamically allocated string passed as a parameter and character is declared as `char character[2]`. Routine: ``` character[0] = newBuff[0]; character[1] = '\0'; strcpy(newBuff, newBuff+1); ``` The strcpy replicates the loss of information as each character is read from it. Problem: Valgrind does warns me about this activity, "Source and destination overlap in strcpy(0x419b818, 0x419b819)". Should I worry about this warning?

Original source

Related problems