ISO/IEC TS 17961 [restrict]

Передающие указатели в тот же объект в качестве аргументов к различному ограничивают - квалифицированные параметры

Описание

Управляйте определением

Передающие указатели в тот же объект в качестве аргументов к различному ограничивают - квалифицированные параметры. [1]

Реализация Polyspace

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

Примеры

развернуть все

Проблема

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

Проверяйте информацию

Разрешимость: неразрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.