¿Cómo evitar que gcc optimice algunas declaraciones en C?

Para hacer una página sucia (conectando el bit sucio en la entrada de la tabla de páginas), toco los primeros bytes de la página de esta manera:

pageptr[0] = pageptr[0]; 

Pero en la práctica, gcc ignorará la statement de la eliminación de la tienda muerta. Para evitar que gcc lo optimice, vuelvo a escribir la statement de la siguiente manera:

 volatile int tmp; tmp = pageptr[0]; pageptr[0] = tmp; 

Parece que el truco funciona, pero algo feo. Me gustaría saber si hay directivas o syntax que tengan el mismo efecto. Y no quiero usar una bandera -O0 , ya que también traerá una gran penalización al rendimiento.

Desactivar la optimización soluciona el problema, pero no es necesario. Una alternativa más segura es hacer ilegal que el comstackdor optimice la tienda utilizando el calificador de tipo volatile .

 // Assuming pageptr is unsigned char * already... unsigned char *pageptr = ...; ((unsigned char volatile *)pageptr)[0] = pageptr[0]; 

El calificador de tipo volatile instruye al comstackdor a ser estricto acerca de los almacenes y cargas de memoria. Uno de los propósitos de volatile es hacer que el comstackdor sepa que el acceso a la memoria tiene efectos secundarios y, por lo tanto, se debe preservar. En este caso, la tienda tiene el efecto secundario de causar un error de página y desea que el comstackdor preserve el error de página.

De esta forma, el código circundante aún puede optimizarse y su código es portátil para otros comstackdores que no entienden la syntax #pragma o __attribute__ GCC.

Puedes usar

 #pragma GCC push_options #pragma GCC optimize ("O0") your code #pragma GCC pop_options 

para deshabilitar optimizaciones desde GCC 4.4.

Consulte la documentación de GCC si necesita más detalles.

En lugar de utilizar los nuevos pragmas, también puede usar __attribute__((optimize("O0"))) para sus necesidades. Esto tiene la ventaja de solo aplicar a una sola función y no a todas las funciones definidas en el mismo archivo.

Ejemplo de uso:

 void __attribute__((optimize("O0"))) foo(unsigned char data) { // unmodifiable compiler code }