Para una implementación que incluye f0
y f1
en el mismo byte, ¿se define el programa a continuación?Campos de bits y puntos de secuencia
struct S0 {
unsigned f0:4;
signed f1:4;
} l_62;
int main (void) {
(l_62.f0 = 0) + (l_62.f1 = 0);
return 0;
}
Estoy interesado en la respuesta para C99 y C11 de si hay razones para pensar que es diferente allí.
En C99, todo lo que encontré fue 6,5: 2:
Entre el anterior y el siguiente punto de la secuencia de un objeto tendrá su valor almacenado modi fi ed como máximo una vez por la evaluación de una expresión. [...]
No tengo claro qué consecuencias tiene este párrafo en el programa anterior.
Según la gran cantidad de pruebas aleatorias, la mayoría de los compiladores parecen generar código donde las dos asignaciones no interfieren.
Esas partes de las normas me dan dolores de cabeza. Mi lectura actual es que la intención es que sea UB (por ejemplo, está claro en C11 que la modificación de los dos campos en dos subprocesos es un curso no sincronizado), pero el lenguaje en 6.5 se olvida de mencionar el campo de bits como en otro lugares donde los campos de bits tienen un manejo especial. – AProgrammer
@AProgrammer: El código anterior tiene un significado lógico claro (trate las escrituras como si ocurrieran secuencialmente, en cualquier orden) y no hay ninguna razón por la cual un compilador cuyo autor no sea obtuso no genere código que produzca ese comportamiento en el caso de un hilo. ¿Puede sugerir alguna razón plausible por la cual los autores del Estándar podrían haber tenido la intención de que sea UB? – supercat