Come impedire a gcc di ottimizzare alcune istruzioni in C?

Per rendere una pagina sporca (inserendo il bit sporco nella voce della tabella di pagina), toccherò i primi byte della pagina in questo modo:

pageptr[0] = pageptr[0]; 

Ma in pratica gcc ignorerà la dichiarazione di eliminazione del punto morto. Per evitare che gcc lo ottimizzi, redisco di nuovo la dichiarazione come segue:

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

Sembra che il trucco funzioni, ma alquanto brutto. Vorrei sapere se esistono direttive o syntax che hanno lo stesso effetto? E non voglio usare una bandiera -O0 , dato che porterà anche una grande penalizzazione delle prestazioni.

La distriggerszione dell’ottimizzazione risolve il problema, ma non è necessario. Un’alternativa più sicura consiste nel rendere illegale il compilatore per ottimizzare lo store utilizzando il qualificatore di tipo volatile .

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

Il qualificatore di tipo volatile indica al compilatore di essere severo riguardo agli archivi e ai carichi di memoria. Uno degli scopi del volatile è di far sapere al compilatore che l’accesso alla memoria ha effetti collaterali, e quindi deve essere preservato. In questo caso, l’archivio ha l’effetto collaterale di causare un errore di pagina e si desidera che il compilatore conservi l’errore di pagina.

In questo modo, il codice circostante può ancora essere ottimizzato e il tuo codice è trasferibile ad altri compilatori che non comprendono la syntax #pragma o __attribute__ di GCC.

Puoi usare

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

disabilitare le ottimizzazioni da GCC 4.4.

Vedi la documentazione GCC se hai bisogno di maggiori dettagli.

Invece di usare i nuovi pragmi, puoi anche usare __attribute__((optimize("O0"))) per le tue esigenze. Questo ha il vantaggio di applicare semplicemente una singola funzione e non tutte le funzioni definite nello stesso file.

Esempio di utilizzo:

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