Битовые поля и точки последовательности - PullRequest
17 голосов
/ 05 февраля 2012

Для реализации, которая упаковывает f0 и f1 в один и тот же байт, определяется ли программа ниже?

struct S0 {
       unsigned f0:4;
       signed f1:4;
} l_62;

int main (void) {
       (l_62.f0 = 0) + (l_62.f1 = 0);
       return 0;
}

Меня интересует ответ для C99 и для C11, если есть основания полагать, что там все по-другому.

В C99 все, что я нашел, было 6,5: 2:

Между предыдущей и следующей точкой последовательности объект должен иметь свой сохраненное значение, измененное не более одного раза путем вычисления выражения. [...]

Мне не ясно, какие последствия этот пункт имеет для программы выше.

Основываясь на большом количестве рандомизированных тестов, большинство компиляторов, по-видимому, генерируют код, в котором эти два назначения не мешают.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2012

C11 считает смежные именованные битовые поля частью одной и той же ячейки памяти.Такие битовые поля не гарантированно обновляются атомарно, другими словами, если одно обновление не упорядочено явно перед другим, поведение не определено.3.14 memory location также содержит подробное объяснение того, когда два поля можно считать находящимися в разных ячейках памяти, поэтому их обновления можно рассматривать независимо.

Если вы измените свою структуру

struct S0 {
       unsigned f0:4;
       int :0;
       signed f1:4;
} l_62;

, так что между этими двумя битовыми полями существует этот причудливый «разделитель расположения памяти», ваш код гарантированно будет в порядке.

Для C99 дело кажется более сложным, нет такого подробногопонятие места памяти.В недавнем обсуждении списка рассылки ядра Linux было заявлено, что, как правило, для всех пар битовых полей гарантируется атомарность при обновлении любого из них.Отправной точкой этого обсуждения был случай, когда gcc неожиданно загрязнил соседнее с битовым полем битовое поле, что привело к ложным сбоям.

0 голосов
/ 06 февраля 2012

Назначение здесь для членов структуры. Тот факт, что они находятся в одном хранилище, не должен влиять на логику. На самом деле вы не сделали назначения для одной и той же вещи.

Конечно, я не адвокат по языку.

...