Перекрывающееся присвоение

Перекрытие памяти между левыми и правыми сторонами присвоения

Описание

Перекрывающееся присвоение происходит, когда существует перекрытие памяти между левыми и правыми сторонами присвоения. Например, переменная присвоена себе, или один член объединения присвоен другому.

Риск

Если левые и правые стороны присвоения имеют перекрытие памяти, поведение или избыточно или не определено. Например:

  • Самоприсвоение, такое как x=(int)(long)x; избыточно, если x не является volatile - квалифицированный.

  • Присвоение одного члена профсоюза другому вызывает неопределенное поведение.

    Например, в следующем коде:

    • Результат присвоения, u1.a = u1.b не определен, потому что u1.b не инициализируется.

    • Результат присвоения u2.b = u2.a зависит от выравнивания и порядка байтов реализации. Это не задано стандартами C.

    union {
       char a;
       int b;
    }u1={'a'}, u2={'a'}; //'u1.a' and 'u2.a' are initialized
    
    u1.a = u1.b; 
    u2.b = u2.a;

Фиксация

Избегайте присвоения между двумя переменными, которые имеют перекрывающуюся память.

Примеры

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

#include <string.h>

union Data {
    int i;
    float f;
};

int main( ) {
    union Data data;
    data.i = 0;
    data.f = data.i;

    return 0;
}

В этом примере переменные data.i и data.f являются частью того же union и хранятся в том же месте. Поэтому часть их перекрытий устройства хранения данных памяти.

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: OVERLAPPING_ASSIGN
Влияние: низко
ID CWE: 665

Введенный в R2015b