Troppo ottimizzato!
Luca Giuzzi
giuzzi a lugbs.linux.it
Mer 21 Maggio 2003 12:43:30 UTC
On Tue, May 20, 2003 at 05:49:47PM +0200, Enrico Colombini wrote:
>
> On Monday 19 May 2003 18:17, Vernia Damiano wrote:
> > Posso capire che lui veda un "var" che non puo' cambiare
>
> Prova con:
> volatile int var = 1;
>
Concordo appieno con la soluzione proposta da Erix.
I qualificatori di tipo servono proprio per controllare l'ottimizzazione
ove il compilatore (di suo) potrebbe commettere degli errori.
"volatile" in particolare, vedi K&R Appendix A 8.2, serve a
"sopprimere ottimizzazioni che potrebbero altrimenti accadere [...]
ad esempio [...] al fine di evitare che il compilatore rimuova
referenze apparentemente ridondanti".
Concretamente: non e' mai piacevole scoprire che il codice compilato
con -O si comporta in modo diverso da quello compilato con -O2
(ma se ci sono diversi livelli di ottimizzazione un motivo c'e' :)) )
ma nel caso concreto non imputerei il tutto ad un baco di gcc, ma
ad una ambiguita' di fondo.
[la domanda che uno puo' porre e'... lo standard C cosa dice...
nel caso specifico assolutamente nulla, in quanto il controllo viene
passato ad una procedura non locale (il signal handler) che dipende
dall'host... nel dubbio prenderei il codice "non ottimizzato" come
quello valido]
Come regola `generica' mi sentirei di suggerire di dichiarare sempre
come "volatile" le variabili che possono essere modificate da una
procedura esterna.
Ciao,
lg
--
Maggiori informazioni sulla lista
Lug
|