es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El compilador tiene permitido omitir el bucle while en boo() 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 si v 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 como volatile, el compilador tiene permitido no volver a leer v->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 si v->cntr es modificado externamente durante la ejecución del bucle. Por lo tanto, siempre es recomendable definir variables compartidas como volatile cuando son accedidas por múltiples hilos o código externo.

Comments are closed.