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

Анализатор обнаружил ошибку, связанную с тем, что в функции memcpy перекрываются области памяти источника и приемника\. Использование функции memcpy в таком случае приведет к неопределенному поведению программы во время исполнения \[1, 2\]\. 

Рассмотрим пример:

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

В данном случае указатель на источник данных \(x\+2\) смещен относительно приемника данных на 8 байт \(sizeof\(int\) \* 2\)\. Попытка копирования 40 байт в приемник из источника приведет к частичному перекрытию области памяти источника\.

Для исправления ошибки необходимо использовать специальную функцию для таких операций – [memmove](http://www.cplusplus.com/reference/cstring/memmove/?kw=memmove)\(\.\.\.\) или скорректировать заданные смещения источника и приемника, чтобы не происходило перекрытия областей памяти\. 

Пример корректного кода:

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



**Дополнительные ссылки:**

1. Stack Overflow\. What is the difference between memmove and memcpy? [Answer](https://stackoverflow.com/questions/1201319/what-is-the-difference-between-memmove-and-memcpy/30121940#30121940)\.
1. Stack Overflow\. [memcpy\(\) vs memmove\(\)](https://stackoverflow.com/questions/4415910/memcpy-vs-memmove)\.