2013-04-10 25 views
6

gcc 4.7.2でコンパイルするために既存のコードを移植していて、nullptrで奇妙な問題が発生しました。私は簡単なテストケースにそれを煮詰めるために管理している:gcc nullptrの問題

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

は-std = C++ 0xの本とG ++ます。test.cpp -oテストをコンパイルします。

私は期待していた出力は "私はここ1"ですが、 "Original value"を得て、SetMarkerが決して呼び出されないことを示します。

Test2またはTest3のいずれかを呼び出すと、予想される出力が得られます。

私が使用しているコードは、Test3で見られるパターンを元々はNULLの前にキャストなしで使用していますが、intからchar *への無効な変換でエラーが発生したため、NULLptrをすべてNULLに変更しました。残念ながら、それは正しく動作しません。

私はおそらくTest2でパターンを使用するように変更する必要がありますが(私はとにかくそれが好きです)、これはコンパイラのバグか、何か不足しているのかどうか不思議です。

+1

g ++の古いバージョンのバグのようです。 4.8.0は正しい出力を与える。 – ecatmur

答えて

7

これをg ++のバグです:すべてのnullptr_t値は彼らがどの(等価ですが、それはあなたのことを意味しないことを前提にタイプnullptr_tの表現で副作用を、廃棄された++ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52988

グラム副作用は無視できます!)

これは4.8.0リリースで修正されています。 4.xブランチの新しいリリース(4.6.4および4.7.3)にも修正が必要です。

関連する問題