exponenta event banner

Допущения о союзах

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

  • Заполнение - заполнение может быть вставлено в конце соединения.

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

  • Endianness - хранится ли наиболее значимый байт слова по самому низкому или самому высокому адресу памяти.

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

При использовании союзов в коде из-за этих проблем проверка Polyspace ® может потерять точность.

Если вы пишете член объединения и читаете обратно другой член объединения, Polyspace считает, что последний член может иметь любое значение, которое допускает его тип. В этом коде участник b из X написан, но a считывается. Полиспейс считает, что 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 считает, что элемент объединения, появляющийся первым в списке объявлений, инициализируется.