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
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 665
Введенный в R2015b