2013-04-10 1 views
6

Je suis en train de porter du code existant pour compiler sous gcc 4.7.2 et j'ai rencontré un problème étrange avec nullptr. Je suis parvenu à la faire bouillir à un simple cas de test:gcc nullptr issue

#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); 
} 

cela avec g Compile ++ test.cpp -o Test std = C++ 0x.

La sortie que je m'attendais est "J'étais ici 1", mais j'ai "Valeur d'origine", indiquant que SetMarker n'est jamais appelé. L'appel de Test2 ou Test3 donne la sortie attendue.

Le code avec lequel je travaille utilise le modèle vu dans Test3 - à l'origine sans le cast en face de la NULL - qui a donné une erreur sur la conversion invalide de int en char * donc j'ai commencé à changer tous ces NULL en nullptr. Malheureusement, cela ne se comporte pas correctement.

Je suis probablement obligé de changer le code pour utiliser le modèle dans Test2 (que je préfère de toute façon) mais je suis curieux de savoir s'il s'agit d'un bogue dans le compilateur, ou si quelque chose me manque.

+1

Ressemble à un bogue dans les anciennes versions de g ++; 4.8.0 donne la sortie correcte. – ecatmur

Répondre

7

Ce bogue dans g ++: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52988

g ++ écartait les effets secondaires dans les expressions de type nullptr_t, en supposant que toutes les nullptr_t valeurs sont équivalentes (dont ils sont, mais cela ne signifie pas que vous peut ignorer les effets secondaires!)

Ceci est corrigé dans la version 4.8.0; les nouvelles versions sur les branches 4.x (4.6.4 et 4.7.3) devraient aussi avoir le correctif.