Overlapping assignment

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

Описание

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

Риск

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

  • Самоприсвоение, такое как 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