ПроблемаКопия перекрывающейся памяти происходит, когда существует перекрытие памяти между источником и целевым аргументом функции копии, такой как memcpy
или strcpy
. Например, источник и целевые аргументы strcpy
указатели на различные элементы в той же строке.
РискЕсли существует перекрытие памяти между источником и целевыми аргументами функций копии, согласно стандартам C, поведение не определено.
ФиксацияОпределите, является ли перекрытие памяти тем, что вы хотите. Если так, найдите альтернативную функцию. Например:
Если вы используете memcpy
чтобы скопировать значения от одной ячейки памяти до другого, используйте memmove
вместо memcpy
.
Если вы используете strcpy
чтобы скопировать одну строку в другого, используйте memmove
вместо strcpy
, можно следующим образом:
s = strlen(source);
memmove(destination, source, s + 1);
strlen
определяет длину строки без пустого терминатора строки. Поэтому необходимо переместить s+1
байты вместо s
байты.
Пример - перекрывающий копию#include <string.h>
char str[] = {"ABCDEFGH"};
void my_copy() {
strcpy(&str[0],(const char*)&str[2]);
}
В этом примере, потому что источник и целевой аргумент являются указателями на ту же строку str
, между их позволенными буферами существует перекрытие памяти.