MISRA C:2012 Rule 19.1

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

Описание

Определение правила

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

Объяснение

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

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

  • Один объект копируется в другой с помощью 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: Обязательно
Введенный в R2014b