Copy of overlapping memory

Источник и целевые аргументы функции копии имеют перекрывающуюся память

Описание

Этот дефект происходит, когда существует перекрытие памяти между источником и целевым аргументом функции копии, такой как 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, между их позволенными буферами существует перекрытие памяти.

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: OVERLAPPING_COPY
Удар: носитель
ID CWE: 475, 628, 687

Введенный в R2015b