Правило 19.1 MISRA C:2012

Объект не должен быть присвоен или скопирован в перекрывающийся объект

Описание

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

Объект не должен быть присвоен или скопирован в перекрывающийся объект.

Объяснение

Когда вы присваиваете объект другому объекту с перекрывающейся памятью, поведение не определено. Исключения:

  • Вы присваиваете объект другому объекту с точно перекрывающейся памятью и совместимым типом.

  • Вы копируете один объект в другое использование memmove.

Обменивайтесь сообщениями в отчете

  • Объект не должен быть присвоен или скопирован в перекрывающийся объект.

  • Место назначения и источник XX перекрытий, поведение не определено.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

void func (void) {
    union {
        short i;
        int j;
    } a = {0}, b = {1};
    
    a.j = a.i;   /* Non-compliant */
    a = b;       /* Compliant */
}

В этом примере нарушено правило, когда a.i присвоен a.j, потому что эти две переменные имеют перекрывающиеся области памяти.

#include <string.h>

int arr[10];

void func(void) {
    memcpy (&arr[5], &arr[4], 2u * sizeof(arr[0]));    /* Non-compliant */
    memcpy (&arr[5], &arr[4], sizeof(arr[0]));         /* Compliant */
    memcpy (&arr[1], &arr[4], 2u * sizeof(arr[0]));    /* Compliant */
}

В этом примере память, равная дважды sizeof(arr[0]), является пространством памяти, поднятым двумя элементами массива. Если то пространство памяти начинается с &a[4] и &a[5], двух перекрытий областей памяти. Правило нарушено, когда функция memcpy используется, чтобы скопировать содержимое этих двух перекрывающихся областей памяти.

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

Группа: наложение устройства хранения данных
Категория: обязательный
Категория AGC: обязательный
Язык: C90, C99

Введенный в R2014b