2013-04-10 14 views
6

Ich portiere bestehenden Code, um unter gcc 4.7.2 zu kompilieren und habe ein seltsames Problem mit nullptr. Ich habe es geschafft, es zu kochen bis zu einem einfachen Testfall:gcc nullptr Ausgabe

#include <stdio.h> 

const char* g_marker = "Original value"; 

void SetMarker(const char* s) 
{ 
    g_marker = s; 
} 

char* Test1() 
{ 
    return SetMarker("I was here 1"), nullptr; 
} 

char* Test2() 
{ 
    SetMarker("I was here 2"); 
    return nullptr; 
} 

char* Test3() 
{ 
    return SetMarker("I was here 3"), (char*)NULL; 
} 

int main() 
{ 
    char* returnValue = Test1(); 
    printf("%s\n", g_marker); 
} 

Kompilieren Sie dieses mit g ++ test.cpp -o Test -std = C++ 0x.

Die Ausgabe, die ich erwarten würde, ist "Ich war hier 1", aber ich bekomme "Originalwert", was bedeutet, dass SetMarker nie aufgerufen wird.

Der Aufruf von Test2 oder Test3 ergibt die erwartete Ausgabe.

Der Code, mit dem ich arbeite, verwendet das in Test3 gesehene Muster - ursprünglich ohne die Umwandlung vor NULL - was einen Fehler bei der ungültigen Konvertierung von int in char * ergab, also änderte ich all diese NULL in nullptr. Leider verhält sich das einfach nicht richtig.

Ich bin wahrscheinlich gezwungen, den Code zu ändern, um das Muster in Test2 zu verwenden (was ich sowieso bevorzuge), aber ich bin neugierig zu wissen, ob dies ein Fehler im Compiler ist, oder wenn ich etwas verpasse.

+1

Sieht aus wie ein Fehler in älteren Versionen von g ++; 4.8.0 gibt die korrekte Ausgabe. – ecatmur

Antwort

7

Dies ist ein Fehler in g ++: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52988

g ++ wurde verworfen Nebenwirkungen in Ausdrücken des Typs nullptr_t, unter der Annahme, dass alle nullptr_t Werte äquivalent sind (was sie sind, aber das bedeutet nicht, dass Sie kann Nebenwirkungen ignorieren!)

Dies ist in der Version 4.8.0 behoben; Neue Releases in den 4.x-Zweigen (4.6.4 und 4.7.3) sollten ebenfalls den Fix haben.