exponenta event banner

Копия перекрывающейся памяти

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

Описание

Этот дефект возникает, когда происходит перекрытие памяти между исходным и целевым аргументом функции копирования, например 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++
По умолчанию: Откл.
Синтаксис командной строки: OVERLAPPING_COPY
Воздействие: среднее
CWE ID: 475, 628, 687
Представлен в R2015b