Search Results for 'g++'


1 POSTS

  1. 2009/02/22 g++의 버그 by 슴갈 (2)

g++의 버그

프로그램 개발자는 컴파일러를 의심하면 안된다. 제일 먼저 자신 탓을 하고, 하드웨어의 특성을 의심하고, 그것도 문제가 아니라면 그 때야 컴파일러를 의심해 보아야 한다.

그런데 수 많은 버그들과 씨름하다보면 가끔씩 컴파일러를 의심해야 할 때도 있다. 특히 변방의 열악한 컴파일러라면 그런 일이 좀 많긴하다. 그런데 이번에는 g++에 대해서 이야기 하고자 한다.

소스

#include <stdio.h>

int main()
{
unsigned char buffer[2] = {0, 0};
unsigned char* pByte = buffer;

*pByte = 1 + *pByte++;

printf("%d, %d\n", buffer[0], buffer[1]);

return 0;
}

이것의 결과는 어떨까. 나는 2개의 g++ 버전으로 테스트를 해보았다.

g++ 4.0.1의 결과

% g++ --version
g++ (GCC) 4.0.1 (Debian 4.0.1-2)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

% g++ q.cpp
% ./a.out
1, 0
% g++ q.cpp -O3
% ./a.out
1, 0

g++ 3.4.4의 결과

$ g++ --version
g++ (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ q.cpp
$ ./a.exe
1, 0
$ g++ q.cpp -O3
$ ./a.exe
0, 1

확실히 뭔가 이상하다. 4번의 실행 결과는 모두 같아야 하는데 마지막 하나는 결과가 다르다. x86과 MIPS와 ARM의 컴파일러가 서로 결과가 다른 것은 그나마 자주 있는 일인데, 같은 x86인데도 불구하고  동일 컴파일러인데도 버전이 달라지면서 결과가 달라진다든지 최적화 옵션에 따라 결과가 달라진다든지 해서는 안될 것이다.

이 문제가 컴파일러를 만든 쪽에 보고가 된 것인지 아닌지는 알 수가 없지만, 하여간 나는 이 문제 때문에 며칠을 날려 먹었던 것이다. (x86 vs. ARM의 경우에는 컴파일러 특성으로 결과가 달라지는 것은 굉장히 흔한 경우이다. 다음 기회에 이것도 한 번 다루겠다.)

Posted by 슴갈

2009/02/22 23:22 2009/02/22 23:22
Response
No Trackback , 2 Comments
RSS :
http://avej.com/textcube/rss/response/7

Trackback URL : http://avej.com/textcube/trackback/7

Comments List

  1. gos 2009/12/26 07:31 # M/D Reply Permalink

    컴파일러 버그는 아닙니다.
    http://en.wikipedia.org/wiki/Sequence_point
    중간에 보시면
    i=i++가 예제로 있고 그 결과가 undefined인 설명이 나와 있습니다.
    (저는 g++가 변방의 열악한 컴파일러는 아니라고 생각합니다. ^^;)

    1. 슴갈 2009/12/28 09:29 # M/D Permalink

      오해가 있으셨나 본데, g++이 변방의 컴파일러라는 의미가 이니었습니다. -변방의 컴파일러에는 그런 문제가 많이 보이긴 한데, 이번에는 g++에 대한 이야기를 한다는 의미- 저는 현재 g++ 계열 이외에는 실무에 사용하는 컴파일러가 없을 정도입니다. (문법 체크를 위한 MSVC++ 정도가 더 추가...)

      그리고 글 내용에는 적지 않았지만 g++ 4.x 컴파일러가 나온 이후로는 저런 방식의 코딩은 warning을 내었습니다. 그리고 그 warning을 조사하다가 이 부분은 스펙상 undefined라는 것을 알고, g++의 각 버전에 대해 문제점을 체크 하던 중 위와 같은 내용을 발견하게 된 것이고요

      당시는 상당한 종류의 컴파일러(변방의 열악한 것을 포함한) 사용하고 있었는데 대부분은 undefined에 대해 내부적인 정책을 가지고 옵션이 변해도 1,0 또는 0,1의 동일한 결과를 유지했지만 cygwin의 g++ 3.4.4만은 옵션에 따라 내부적인 정책이 달라서 이 글을 쓰게 된 것입니다.

Leave a comment
[로그인][오픈아이디란?]

블로그 이미지

GP2X WIZ와 CAANNO와 bada용 게임 개발을 하자

- 슴갈

Notices

Archives

Authors

  1. 슴갈

Recent Trackbacks

Calendar

«   2012/02   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Site Stats

Total hits:
36068
Today:
17
Yesterday:
44