# V743. The memory areas must not overlap. Use 'memmove' function.

The analyzer detected an error that has to do with using function memcpy when dealing with overlapping source and destination memory blocks, in which case the behavior is undefined [1, 2].

Consider the following example:

    void func(int *x){
      memcpy(x, x+2, 10 * sizeof(int));
    }

In this case, the source pointer (x+2) is offset from the destination by 8 bytes (sizeof(int) * 2). Copying 40 bytes from the source into the destination will lead to partial overlapping of the source memory block.

To fix this error, one should use a special function, memmove(...), or revise the offset between the source and destination blocks to avoid their overlapping.

Example of correct code:

    void func(int *x){
      memmove(x, x+2, 10 * sizeof(int));
    }

References:

- Stack Overflow. What is the difference between memmove and memcpy? Answer.
- Stack Overflow. memcpy() vs memmove().

This diagnostic is classified as:

CWE-475 CERT-EXP37-C

You can look at examples of errors detected by the V743 diagnostic.