Объединения

В некоторых ситуациях объединения могут помочь вам создать эффективный код. Однако, если вы пишете члену профсоюза и читаете назад различного члена профсоюза, поведение зависит от размеров члена и может быть зависящим от реализации. Необходимо определить следующее для реализации:

  • Дополнение – Дополнение может быть вставлено в конце объединения.

  • Выравнивание – у членов структур в объединении могут быть различные выравнивания.

  • Порядок байтов – Хранится ли старший значащий байт слова в самом низком или самом высоком адресе памяти.

  • Битный порядок – Биты в байтах могут иметь и различную нумерацию и выделение к битовым полям.

Когда вы используете объединения в своем коде из-за этих проблем, верификация Polyspace® может потерять точность.

Если вы пишете члену профсоюза и читаете назад другого члена профсоюза, Polyspace полагает, что у последнего члена может быть любое значение, которое позволяет его тип. В этом коде, член b из X записан, но a читается. Polyspace рассматривает тот a может иметь любой int значение и обе ветви if-else оператор достижим.

typedef union _u {
    int a;
    char b[4];
} my_union;

void main() {
    my_union X;

    X.b[0] = 1;
    X.b[1] = 1;
    X.b[2] = 1;
    X.b[1] = 1;
    if (X.a == 0x1111) {
    }
    else {
    } 
}

Чтобы избегать использования объединений в вашем коде, проверяйте на нарушения MISRA C:2012 Rule 19.2.

Примечание

Если вы инициализируете объединение, использующее статический инициализатор, в соответствии со стандартом ANSI® C, Polyspace полагает, что член профсоюза, появляющийся первый в списке объявлений, инициализируется.