오늘 같이 일하는 인도의 coworker의 코드를 리뷰를 했다.
coworker가 도저히 이해가 안되는 현상이 발생한다며..
지역변수로 선언된 한 구조체를 잘 사용하다가 어느순간 NULL 이 된다는 것이었다.
코드를 보내보라고 해서 리뷰를 시작하다가 이상한 부분을 발견..
대략 아래와 같은 flow를 가지는 코드였다.
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void getstr(char* str)
{
str = (char *)malloc(6);
strncpy(str, "aaaaa", 6);
return;
}
int main(int argc, char** argv)
{
int a = 1;
int b = 2;
int c = 3;
char* str = NULL;
getstr(str);
memset(&str, 0x00, 6);
return 0;
}
위 코드를 보면 알겠지만,
함부로 포인터를 가지고 놀다가 stack 영역이 깨져버린 것이었다.(stack smashing detected!! ㅋㅋ)
아 ㅅㅂ.. (이걸 어떻게 영어로 설명하지? 라는 두려움 때문에 ㅋㅋ)
coworker 에게 설명을 했다.
me : If you want to work this code correctly, you should use double-pointer argument in getstr() function.
str in getstr and str in main have different values.
coworker: no. it is same. it is pointer.
me: No.. (아.. 이녀석을 어찌하나요....)
And, why input the address of str to memset as its argument? it is strange..
(아마도 이녀석이 뭔가 안되니까 &를 붙여보기도 한것 같다 ㅋㅋ)
이상황은 뭔가 복합적인 무지로 인하여 발생한 문제지만..
pointer를 가지고 call-by-reference를 이용하고자 한다면 조심스럽게 생각해야한다.
우리의 coworker는 경솔히 생각하고 사용한 좋은 예이다.
pointer를 막연하게 어떠한것을 가리키는 것이라고 생각하지 말고 확실하게 생각하자.
"주소값을 가져야하는, int 나 char와 똑같이 다루어야 하는 데이터형"
과연 우리의 coworker는 내 말뜻을 이해하고 수정된 코드를 보여줄 것인가..
댓글을 달아 주세요
chpie 2012/05/13 14:05 댓글주소 수정/삭제 댓글쓰기
커피집 차리세요 놀러갈께요 ㅋㅋㅋ