C11 – omitiendo el posible bucle infinito por el compilador.
Suponga el siguiente código:
struct a {
unsigned cntr;
};
void boo(struct a *v) {
v->cntr++;
while(v->cntr > 1);
}
Me pregunto si el compilador puede omitir el bucle while
dentro de boo()
debido a la siguiente declaración en el estándar C11:
Una declaración de iteración cuya expresión de control no es una expresión constante,156) que no realiza operaciones de entrada/salida, no accede a objetos volátiles y no realiza operaciones de sincronización o atómicas en su cuerpo, expresión de control o (en el caso de una declaración de iteración
for
) su expresión-3, puede ser asumida por la implementación como terminando.157)
157)Esto está destinado a permitir transformaciones del compilador como la eliminación de bucles vacíos, incluso cuando no se puede demostrar la terminación.
¿Puede considerarse v->cntr
, en la expresión de control, como una sincronización ya que v
puede ser un puntero a una estructura global que puede ser modificada externamente (por ejemplo, por otro hilo)?
Pregunta adicional:
¿Está permitido que el compilador no vuelva a leer v->cntr
en cada iteración si v
no está definido como volatile
?
davy.ai
El compilador tiene permitido omitir el bucle
while
enboo()
según lo mencionado en la declaración del estándar C11. Sin embargo,v->cntr
no puede considerarse como sincronización ya que no realiza ninguna operación de sincronización o atómica. Incluso siv
es un puntero a una estructura global que puede ser modificada externamente, no afecta al flujo de control del bucle.Si
v
no está definido comovolatile
, el compilador tiene permitido no volver a leerv->cntr
en cada iteración. Esto se debe a que la expresión controladora no es una expresión constante, pero tampoco está accediendo a objetos volátiles. Sin embargo, esto podría llevar a comportamientos inesperados siv->cntr
es modificado externamente durante la ejecución del bucle. Por lo tanto, siempre es recomendable definir variables compartidas comovolatile
cuando son accedidas por múltiples hilos o código externo.