후로그램이 본인이 의도하지 않은 동작을 하는 것을 버그라고 할 것 같다.

이러한 버그를 몇가지로 분류해 보면 아래와 같다.


1. 에러

 - 개발자가 미리 정의해 놓은 이상동작으로, 로그나 콘솔상에 에러메시지를 툭 내뱉는 것이 특징이다. -_-

소스 상에는 대략 이렇게 구현된다.

if (pHandle == NULL)

{

fprintf(stderr,"(%s;%s;%d) 핸들 어따 빼먹고 다니냐!!!",__FILE__,__FUNCTION__,__LINE__);

return -1;

}

위치 정보를 출력하는 경우도 있고 아닌 경우도 있지만, 어느쪽이든 소스상에서 찾는데는 큰 무리가 없다.

디버깅 난이도는 대부분 높지 않은 편이다 


2. 세그멘테이션 폴트 (일명 포인터 에러)

 - 대략 배열이나 포인터를 다루기 시작하면서, 마주치기 시작하는 우리에게  친근한(?) 버그.

매우 다양한 바리에이션이 존재하기 때문에, 초심자부터 경지에 오른 고수들에게도 매우 사랑받는 버그이다.

프로세스가 할당받지 않은 메모리 공간을 참조할 때 발생한다. 프로그램이 동작중에 살해당하는게 특징이다.

소스상에는 대략 다음과 같이 구현된다.

int *p = 0;

*p = 0;

워낙 다양한 원인을 가지고 있기 때문에, 디버깅 난이도도 천차만별이다. 특정한 절차를 거치면, 곧바로 재현되는 경우도 있고,

몇개월에 한번씩만 재현되는 귀하신 분(?) 들도 계시다. 일반화 하기는 좀 그렇지만, 코드상의 오류에 의해 발생되는 것은 곧바로

재현이 되고, 메모리 누출이나 레이쓰컨디션에 의해 발생하는 경우는 재현에 시간이 오래걸리는 경우가 많다.

gdb와 같은 디버거를 물리거나, printf를 많이 찍거나, 혹은 문제가 발생하는 부분 주변의 코드를 유심히 쳐다보면(!) 고쳐지는 경우가 많다.


3. 메모리 누출

- 메모리를 할당하고 해제하지 않은 채로 포인터를 갖다 버리면 발생한다.

프로그램이 잘 동작하는것이 특징(!)이다. 그리고 3일~1달후에 일제히 죽는다 -_-

세그멘테이션 폴트와 함께 프로그래머에게 열렬한 사랑을 받는 버그이며, 그 사랑의 결실으로 가비지 컬렉터가 개발되었다 -_-

소스 상에는 대략 다음과 같이 구현된다.

int fc(int cond)

{

int *a = (int*)malloc(sizeof(int)*4);

if(c 1)

{

return 0;

}

free(a);

return 0;

}

잠복기를 가지는데다, 위치를 특정하기도 쉽지가 않다는 점에서 디버깅 난이도가 높은 편에 속한다.

정적분석을 이용하거나, 메모리누출을 감지하는 툴을 적용하거나 혹은 의심가는 부분의 코드를 유심히 쳐다보는 식으로 대응이 가능하다.


4. 버퍼 오버런(오버플로, 덮어쓰기, 메모리 치기 등등)

- 잘못된 메모리에 썻는데, 세그멘테이션 폴트가 발생하지 않는 경우이다.

잘못 접근한 메모리가 프로세스가 다른 용도로 이미 할당받은 곳일 경우, 쓰레드끼리 치고받고 싸우다 전역번수를 덮어쓴다거나

등등 여러가지 이유가 있다.

위에서 언급한 버그들 중 위치를 특정하기 가장 까다로운 편에 속한다.

코드상에는 대략 이렇게 구현되는 경우가 있다

int a[3];

memset(a,0,sizeof(a)*3);

위치를 특정하기 어려운 이유는 다음과 같다.

1. 대부분 잘 돌아간다. 

- 1년 이상을 멀쩡하게 잘 돌아가는 경우도 허다하다. 그리고 꼭 데모할 때 등장한다.

2. 코드와 이상동작 사이의 개연성이 거의 없다.

한마디로 사운드 쪽 코드에 문제가 있는데 현상은 그래픽쪽에서 나타날 수도 있다는 의미이다.

프로그램의 동작을 보고 코드의 문제부분을 특정하는 것이 매우 어렵다.(요령이 있다면 어느 정도는 가능한 경우도 있다.)

보통은 의심가는 부분의 코드를 유심히 쳐다보는 식으로 대응한다.(...)