exponenta event banner

Перекрывающееся назначение

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

Описание

Этот дефект возникает при перекрытии памяти между левой и правой сторонами назначения. Например, переменная назначается самому себе или одному члену объединения назначается другой.

Риск

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

  • Самостоятельное присвоение, например 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++
По умолчанию: Откл.
Синтаксис командной строки: OVERLAPPING_ASSIGN
Воздействие: Низкий
ИДЕНТИФИКАТОР CWE: 665
Представлен в R2015b