2013-04-10 11 views
6

मैं जीसीसी 4.7.2 के तहत संकलित करने के लिए मौजूदा कोड पोर्ट कर रहा हूं और नलप्टर के साथ एक अजीब समस्या में भाग गया हूं। मैं एक साधारण परीक्षण मामले के लिए नीचे उबाल में कामयाब रहे:जीसीसी नलप्टर समस्या

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

इस के साथ जी ++ test.cpp -ओ परीक्षण संकलित -std = C++ 0x।

आउटपुट मैं अपेक्षा करता हूं कि "मैं यहां 1 था", लेकिन मुझे "मूल मूल्य" मिलता है, जो इंगित करता है कि SetMarker कभी नहीं कहा जाता है।

या तो टेस्ट 2 या टेस्ट 3 को कॉल करने से अपेक्षित आउटपुट मिलता है।

जिस कोड के साथ मैं काम कर रहा हूं वह टेस्ट 3 में दिखाई देने वाले पैटर्न का उपयोग करता है - मूल रूप से न्यूल के सामने कास्ट किए बिना - जिसने int से char * में अमान्य रूपांतरण पर त्रुटि दी है, इसलिए मैंने उन सभी NULLs को nullptr में बदलना शुरू कर दिया। दुर्भाग्य से, यह सही ढंग से व्यवहार नहीं करता है।

मुझे संभवतः टेस्ट 2 में पैटर्न का उपयोग करने के लिए कोड बदलने के लिए मजबूर होना पड़ता है (जिसे मैं वैसे भी पसंद करता हूं) लेकिन मुझे यह जानकर उत्सुकता है कि यह कंपाइलर में एक बग है, या अगर मुझे कुछ याद आ रहा है।

+1

g ++ के पुराने संस्करणों में एक बग की तरह दिखता है; 4.8.0 सही आउटपुट देता है। – ecatmur

उत्तर

7

इस में एक बग है जी ++: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52988

जी ++ प्रकार nullptr_t के भाव में दुष्प्रभाव को त्यागकर किया गया था, इस धारणा है कि सभी nullptr_t मान बराबर हैं (जो वे कर रहे हैं पर, लेकिन यह है कि आप मतलब यह नहीं है दुष्प्रभावों को अनदेखा कर सकते हैं!)

यह 4.8.0 रिलीज में तय किया गया है; 4.x शाखाओं (4.6.4 और 4.7.3) पर नई रिलीज भी तय होनी चाहिए।