336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

코딩을 하다보면 발생하는 버그중 가장 악질적인 것중 하나가 디버그 버전에서는 나타나지 않고 릴리즈 버전에서만 나타나는 버그다. 그것도 랜덤하게....

랜덤하게 나타나는 버그 중에서도 자신이 만든 루틴에서 나는 버그는 그나마도 괜찮다고 할 수 있다. 악질 중에 악질은 아무 생각 없이 쓴 표준 함수에서 나타나는 경우다. 특히 표준 함수를 쓸 때는 대부분이 아무런 문제가 없다는 확신을 가지고 쓰기 때문에 더욱 찾기가 힘들다.

DJ Max때도 그런 악질 적인 버그를 한번 만난 적이 있다. 릴리즈모드에서만 가끔씩 랜덤으로 유저가 튕겨져 나간다는 것이었다. 디버그 모드에서는 아무리 해도 찾을 수 없는 그 버그의 원흉은 아무런 생각 없이 썼던 strncpy() 함수에 있었다. 물론 코드를 검사할 때 strncpy()함수에 큰 주의를 기울이지 않기 마련이기 때문에 더 찾기가 힘들었다.

아마도 코드는 이랬던 것 같다.


char szDst[256];

// szStc 는 인수로 넘어온 const char* 형 변수다.
strncpy(szDst, szSrc, 2);

// 이하 이어지는 코드...


아마도 고수분이라면 이 코드의 문제점을 바로 알아봤을 것이다. 따로 놓으면 보이지만 이 코드가 수만줄 사이에 끼여져 있다면 참으로 찾기 힘든 코드다.

이 코드 발생 원인에는
첫번 째로 초기화에 충실하지 않았다는 점이고 두번 째로 strncpy()의 정의를 확실히 몰랐다는 점을 들 수 있겠다.

보통은 문자열을 주어진 길이만큼 복사한다고만 알고 있는 strncpy()의 확실한 정의는 이렇다.

"문자열을 정해진 길이만큼 복사한다. 소스 문자열의 길이와는 별개로 무조건 정해진 길이만큼 복사되기 때문에 문자열이 짤릴 수도 있고 뒷부분이 NULL문자로 채워질 수도 있다. 채워넣을 문자열 크기는 주어진 길이보다 커야 한다. 그렇지 않으면 인접 데이터가 파괴된다."

여기서 주의해야 할 것은 주어진 길이만큼 복사한다는 내용 이외의 것이다. 다시 위의 코드로 돌아가보면

szSrc로부터 szDst로 2개의 문자가 복사된다. 이 경우 문자열중 앞쪽 2개만 사용할 때는 문제가 없지만 2개를 넘어갈 때는 세번째 멤버부터는 데이터를 보장할 수 없기 때문에 문제가 된다.

이 코드를 고칠려면


char szDst[256] = { 0 };
을 해주던가

strncpy(szDst, szSrc, 2);
이후에

szDst[2] = 0;


을 붙여주어 채워지지 않은 나머지 부분에 널문자임을 확실히 해 주어야 한다.


출처 : http://trapping.egloos.com/2509570

'Programming > C / C++' 카테고리의 다른 글

자료형의 종류와 범위  (0) 2015.02.07
__IN & __OUT  (0) 2015.02.07
XOR Swap  (0) 2015.02.07
struct tm  (0) 2015.02.07
Lotto  (0) 2015.02.07
Posted by 역시인생한방
,