В некоторых ситуациях объединения могут помочь вам создать эффективный код. Однако, если вы пишете члену профсоюза и читаете назад различного члена профсоюза, поведение зависит от членских размеров и может быть зависящим от реализации. Необходимо определить следующее для реализации:
Дополнение – Дополнение может быть вставлено в конце объединения.
Выравнивание – у членов структур в объединении могут быть различные выравнивания.
Порядок байтов – Хранится ли старший значащий байт слова в самом низком или самом высоком адресе памяти.
Битный порядок – Биты в байтах могут иметь и различную нумерацию и выделение к битовым полям.
Когда вы используете объединения в своем коде из-за этих проблем, верификация 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 полагает, что член профсоюза, появляющийся первый в списке объявлений, инициализируется.