Re: GCC Warnung dereferencing type-punned pointer
Hi, at 15:03 10.09.03, Ralf Corsepius wrote:
GCC-3.3.x liefert gelegentlich folgende Warnung:
warning: dereferencing type-punned pointer will break strict-aliasing rules
Was will mir diese Warnung sagen?
Dass Du unanstaendige Dinge tust und -fstrict-aliasing eingeschaltet hast.
Wie bedeutsam ist sie?
Das kommt auf den Kontext an, in dem sie auftritt. Nach dem, wie ich es verstehe, ist es schlicht moeglich, dass der Optimizer etwas aus dem Tritt kommt und mit Annahmen arbeitet, die fuer den Code nicht gelten. Er koennte z.B. die Reihenfolge von Variablenzugriffen aendern, weil er davon ausgeht, dass Du zwei unterschiedliche Variablen ansprichst, diese aber in Wirklichkeit auf derselben Adresse liegen und somit Schreibzugriff 2 vor Lesezugriff 1 ausfuehren, waehrend Du im Source davon ausgehst, dass Lesezugriff 1 natuerlich vor Schreibzugriff 2 stattfindet.
Wenn gcc schon warnt, wie sähen die Folgen aus, falls etwas "zerbricht"?
Das Programm liefert unerwartete (sogenannte "falsche") Resultate. Gegenfrage: Warum schaltest Du eigentlich eine Option ein von der Du nicht weisst, was sie bedeutet? Vinzent. -- MDC Max Daetwyler AG Vinzent Hoefler, Software-Development Flugplatz Fax. +41-62-919 36 30 CH-3368 Bleienbach Tel. +41-62-919 36 23
Hi, On Wed, 10 Sep 2003, Vinzent Hoefler wrote:
Gegenfrage: Warum schaltest Du eigentlich eine Option ein von der Du nicht weisst, was sie bedeutet?
Gegenfrage: Warum sagst du sowas, obwohl du nicht weisst, was alles in -O2 ist? Ciao, Micha.
On Wed, 2003-09-10 at 17:01, Michael Matz wrote:
Hi,
On Wed, 10 Sep 2003, Vinzent Hoefler wrote:
Gegenfrage: Warum schaltest Du eigentlich eine Option ein von der Du nicht weisst, was sie bedeutet?
Gegenfrage: Warum sagst du sowas, obwohl du nicht weisst, was alles in -O2 ist? Zusatzfrage: -fstrict-alias ist Teil von -02?
Auf allen Architekturen (Ich teste gerade mehrere gcc-3.3.2pre Cross-Compiler) Ralf
Hi, On Wed, 10 Sep 2003, Ralf Corsepius wrote:
Zusatzfrage: -fstrict-alias ist Teil von -02?
Ja. Schon seit ner ganzen Weile. Nur die Warnung ist neu in 3.3.x
Auf allen Architekturen (Ich teste gerade mehrere gcc-3.3.2pre Cross-Compiler)
Ja. Ciao, Micha.
At 17:01 10.09.03, Michael Matz wrote:
On Wed, 10 Sep 2003, Vinzent Hoefler wrote:
Gegenfrage: Warum schaltest Du eigentlich eine Option ein von der Du nicht weisst, was sie bedeutet?
Gegenfrage: Warum sagst du sowas, obwohl du nicht weisst, was alles in -O2 ist?
2.95.2 sagte mir noch: | `-O2' turns on all optional optimizations except for loop | unrolling, function inlining, and strict aliasing optimizations. Sorry, wenn ich mir so was nicht fuer jede neue Compilerversion merken will. Vinzent.
On Wed, 2003-09-10 at 16:09, Vinzent Hoefler wrote:
Hi, at 15:03 10.09.03, Ralf Corsepius wrote:
GCC-3.3.x liefert gelegentlich folgende Warnung:
warning: dereferencing type-punned pointer will break strict-aliasing rules
Was will mir diese Warnung sagen?
Dass Du unanstaendige Dinge tust
Es handelt sich um ältern Code auf extremer Low-Level-Ebene, etwa von folgender Bauart: static inline void hash_insert(int* hash, int key1, int key2, void** el); ... somestruct1 *e1; e1 = (somestruct*) malloc(sizeof(somestruct1)); hash_insert(hash,key1,key2,(void**) &e1); somestruct2 *e2; e2 = (somestruct2*) malloc(sizeof(somestruct2)); hash_insert(hash,key1,key2,(void**) &e2); ... GCC bemeckert die (void**) Casts.
und -fstrict-aliasing eingeschaltet hast. Das habe ich eben nicht explizit eingeschaltet. Es mag sein, dass es der Compiler implizit irgendwo einschaltet, wäre mir aber neu.
Wenn gcc schon warnt, wie sähen die Folgen aus, falls etwas "zerbricht"?
Das Programm liefert unerwartete (sogenannte "falsche") Resultate. Gegenfrage: Warum schaltest Du eigentlich eine Option ein von der Du nicht weisst, was sie bedeutet? Ich habe -fstrict-aliasing nicht explizit eingestaltet! Wenn ich es hätte, hätte ich sehr wahrscheinlich auch gcc.info dazu gelesen.
Ralf
Ralf Corsepius
Es handelt sich um ältern Code auf extremer Low-Level-Ebene, etwa von folgender Bauart:
static inline void hash_insert(int* hash, int key1, int key2, void** el);
... somestruct1 *e1; e1 = (somestruct*) malloc(sizeof(somestruct1)); hash_insert(hash,key1,key2,(void**) &e1);
somestruct2 *e2; e2 = (somestruct2*) malloc(sizeof(somestruct2)); hash_insert(hash,key1,key2,(void**) &e2); ...
GCC bemeckert die (void**) Casts.
Zu Recht. Aber wie ich in meiner ersten Mail schon schrieb, ist dieser Fall nun sehr einfach: static inline void hash_insert(int* hash, int key1, int key2, void* elp) { void **el = (void **)elp; [ ... ] } somestruct1 *e1; e1 = (somestruct*) malloc(sizeof(somestruct1)); hash_insert(hash,key1,key2, &e1); Und schon passt alles, der Compiler warnt nicht mehr und Alias basierte Optimierung wird auch durchgeführt.
und -fstrict-aliasing eingeschaltet hast. Das habe ich eben nicht explizit eingeschaltet. Es mag sein, dass es der Compiler implizit irgendwo einschaltet, wäre mir aber neu.
Tut er seit 3.3 mit -O2. Philipp
participants (4)
-
Michael Matz
-
Philipp Thomas
-
Ralf Corsepius
-
Vinzent Hoefler