exponenta event banner

MISRA C:2012 Правило 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 используется для копирования содержимого этих двух перекрывающихся областей памяти.

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

Группа: Перекрывающееся хранилище
Категория: Обязательно
Категория СМЖЛ: обязательная
Представлен в R2014b