- 안영기의 개발실 - (Tizen / WIZ / CAANOO / bada): g++ 태그 글 목록
http://smgal.ismine.net/tc_191/blog1/
Tizen과 GP2X WIZ와 CAANNO와 bada용 게임 개발을 하자
2014-10-31T05:46:57+09:00
Textcube 1.9.1
g++의 버그
안영기
http://smgal.ismine.net/tc_191/blog1/7
2009-03-15T08:06:12+09:00
2009-02-22T23:22:56+09:00
프로그램 개발자는 컴파일러를 의심하면 안된다. 제일 먼저 자신 탓을 하고, 하드웨어의 특성을 의심하고, 그것도 문제가 아니라면 그 때야 컴파일러를 의심해 보아야 한다.
<DIV><BR></DIV>
<DIV>그런데 수 많은 버그들과 씨름하다보면 가끔씩 컴파일러를 의심해야 할 때도 있다. 특히 변방의 열악한 컴파일러라면 그런 일이 좀 많긴하다. 그런데 이번에는 g++에 대해서 이야기 하고자 한다.</DIV>
<DIV><BR></DIV>
<DIV><SPAN style="FONT-WEIGHT: bold">소스</SPAN></DIV>
<DIV><BR></DIV>
<BLOCKQUOTE class=webkit-indent-blockquote style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0px 40px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none"><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal"><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><SPAN style="COLOR: rgb(0,0,255)">#include</SPAN> <SPAN style="COLOR: rgb(155,24,193)"><stdio.h></SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><BR><BR></SPAN><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal"><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><SPAN style="COLOR: rgb(0,0,255)">int</SPAN> main()</SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><BR></SPAN><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal"><SPAN style="FONT-FAMILY: GulimChe, sans-serif">{</SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><BR></SPAN><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal"><SPAN class=Apple-tab-span style="WHITE-SPACE: pre"><SPAN style="FONT-FAMILY: GulimChe, sans-serif"> </SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><SPAN style="COLOR: rgb(0,0,255)">unsigned char</SPAN> buffer[2] = {0, 0};</SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><BR></SPAN><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal"><SPAN class=Apple-tab-span style="WHITE-SPACE: pre"><SPAN style="FONT-FAMILY: GulimChe, sans-serif"> </SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><SPAN style="COLOR: rgb(0,0,255)">unsigned char</SPAN>* pByte = buffer;</SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><BR><BR></SPAN><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal"><SPAN class=Apple-tab-span style="WHITE-SPACE: pre"><SPAN style="FONT-FAMILY: GulimChe, sans-serif"> </SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif">*pByte = 1 + *pByte++;</SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><BR><BR></SPAN><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal"><SPAN class=Apple-tab-span style="WHITE-SPACE: pre"><SPAN style="FONT-FAMILY: GulimChe, sans-serif"> </SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif">printf(<SPAN style="COLOR: rgb(0,153,102)">"%d, %d\n"</SPAN>, buffer[0], buffer[1]);</SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><BR><BR></SPAN><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal"><SPAN class=Apple-tab-span style="WHITE-SPACE: pre"><SPAN style="FONT-FAMILY: GulimChe, sans-serif"> </SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><SPAN style="COLOR: rgb(0,0,255)">return</SPAN> 0;</SPAN></SPAN><SPAN style="FONT-FAMILY: GulimChe, sans-serif"><BR></SPAN><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal"><SPAN style="FONT-FAMILY: GulimChe, sans-serif">}</SPAN></SPAN><BR></BLOCKQUOTE>
<DIV><BR></DIV>
<DIV>이것의 결과는 어떨까. 나는 2개의 g++ 버전으로 테스트를 해보았다.</DIV>
<DIV><BR></DIV>
<DIV><SPAN style="FONT-WEIGHT: bold">g++ 4.0.1의 결과</SPAN></DIV>
<DIV><BR></DIV>
<BLOCKQUOTE class=webkit-indent-blockquote style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0px 40px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none"><SPAN style="FONT-SIZE: 13px; COLOR: rgb(255,118,53); LINE-HEIGHT: normal; FONT-FAMILY: GulimChe">% g++ --version</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal; FONT-FAMILY: GulimChe">g++ (GCC) 4.0.1 (Debian 4.0.1-2)</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal; FONT-FAMILY: GulimChe">Copyright (C) 2005 Free Software Foundation, Inc.</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal; FONT-FAMILY: GulimChe">This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</SPAN><BR><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(255,118,53); LINE-HEIGHT: normal; FONT-FAMILY: GulimChe">% g++ q.cpp </SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(255,118,53); LINE-HEIGHT: normal; FONT-FAMILY: GulimChe">% ./a.out</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal; FONT-FAMILY: GulimChe">1, 0</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(255,118,53); LINE-HEIGHT: normal; FONT-FAMILY: GulimChe">% g++ q.cpp -O3</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(255,118,53); LINE-HEIGHT: normal; FONT-FAMILY: GulimChe">% ./a.out</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal; FONT-FAMILY: GulimChe">1, 0</SPAN><BR></BLOCKQUOTE>
<DIV><BR></DIV>
<DIV><SPAN style="FONT-WEIGHT: bold">g++ 3.4.4의 결과</SPAN><BR></DIV>
<DIV><BR></DIV>
<BLOCKQUOTE class=webkit-indent-blockquote style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0px 40px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none"><SPAN style="FONT-SIZE: 13px; COLOR: rgb(255,118,53); LINE-HEIGHT: normal; FONT-FAMILY: gulim">$ g++ --version</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal; FONT-FAMILY: gulim">g++ (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal; FONT-FAMILY: gulim">Copyright (C) 2004 Free Software Foundation, Inc.</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal; FONT-FAMILY: gulim">This is free software; see the source for copying conditions. There is NO</SPAN> <SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal; FONT-FAMILY: gulim">warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</SPAN><BR><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(255,118,53); LINE-HEIGHT: normal; FONT-FAMILY: gulim">$ g++ q.cpp</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(255,118,53); LINE-HEIGHT: normal; FONT-FAMILY: gulim">$ ./a.exe</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal; FONT-FAMILY: gulim">1, 0</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(255,118,53); LINE-HEIGHT: normal; FONT-FAMILY: gulim">$ g++ q.cpp -O3</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(255,118,53); LINE-HEIGHT: normal; FONT-FAMILY: gulim">$ ./a.exe</SPAN><BR><SPAN style="FONT-SIZE: 13px; COLOR: rgb(51,51,51); LINE-HEIGHT: normal; FONT-FAMILY: gulim">0, 1</SPAN><BR></BLOCKQUOTE>
<DIV><BR></DIV>
<DIV>확실히 뭔가 이상하다. 4번의 실행 결과는 모두 같아야 하는데 마지막 하나는 결과가 다르다. x86과 MIPS와 ARM의 컴파일러가 서로 결과가 다른 것은 그나마 자주 있는 일인데, 같은 x86인데도 불구하고 동일 컴파일러인데도 버전이 달라지면서 결과가 달라진다든지 최적화 옵션에 따라 결과가 달라진다든지 해서는 안될 것이다.</DIV>
<DIV><BR></DIV>
<DIV>이 문제가 컴파일러를 만든 쪽에 보고가 된 것인지 아닌지는 알 수가 없지만, 하여간 나는 이 문제 때문에 며칠을 날려 먹었던 것이다. (x86 vs. ARM의 경우에는 컴파일러 특성으로 결과가 달라지는 것은 굉장히 흔한 경우이다. 다음 기회에 이것도 한 번 다루겠다.)</DIV><p><strong><a href="http://smgal.ismine.net/tc_191/blog1/7?commentInput=true#entry7WriteComment">댓글 쓰기</a></strong></p>