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 определяет длину строки без терминатора строки null. Поэтому необходимо двигаться s+1 байты вместо s байты.

Пример - Перекрывающаяся копия
#include <string.h>

char str[] = {"ABCDEFGH"};

void my_copy() {
    strcpy(&str[0],(const char*)&str[2]);
}

В этом примере, потому что исходный и целевой аргументы являются указателями на одну и ту же строку str, существует перекрытие памяти между их разрешенными буферами.

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

Решимость: Undecidable
Введенный в R2019a

[1] Выдержки из стандарта «Техническая спецификация ISO/IEC TS 17961 - 2013-11-15» воспроизводятся с согласия АФНОР. Только оригинальный и полный текст стандарта, опубликованный AFNOR Editions - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.