개발자라면 누구나 아는 기본 중에 기본이다.
말하고 싶은 것은 바로 메모리 침범이다.
초기 진행중인 프로젝트나 규모가 몇만라인짜리 큰 프로젝트! 예를 들어 온라인 게임 같은 경우
클라이언트 내부적으로 수많은 동적, 정적 할당이 이루어진다.
정적할당은 보통 메모리 낭비가 생기지만 오류발생의 원인으로는 드물다.
지금 말하고 싶은 것은 동적할당 이다.
개발자들은 너무나 익숙하다는 듯 new / malloc 을 사용한다.
이 두개만 조심하면 되는가? 아니다.
말을 조금 바꿔보자면 정적할당은 별로 크게 조심하지 않아도 될 것 같지만!!!
잠재적인 큰 오류 ( 클라이언트 뻑! ) 의 원인이 될 수 있다.
우리가 자주 사용하는 memcpy, sprintf, strcpy 등 으로 인하여 static 변수에서 경계위반! 즉, 메모리 침범을 야기 시킬 수 있다는 말이다.
코드 하일라이트 기능이 없어. 테스트 중인 코드를 전부 옮겨 놓을수는 없지만...
int main()
{
char* p1 = new char[1000]; memset(p1, 0xBB, sizeof(char)*1000);
char* p = p1;
for( int i = 0; i < BUFFER_SIZE + OVERFLOW_SIZE; i++ ) // 메모리 침범
*(p++) = 0xA0;
char* p2 = new char[1000]; memset(p2, 0xBB, sizeof(char)*1000);
delete []p1; // error
delete []p2;
return 1;
} |
위 코드를 실행해 보아라.
char로 1000byte를 할당 받았다 하더라도 힙 메모리 상에서 1000byte 앞 혹은 뒤로 할당받은 메모리의 정보 값이 더 들어가있는것 같다. 그런것으로 침범을 따지는데 사용되어 지지 않았나 싶다.
각 메모리 값을 찍어보면 일정한 규칙의 값(byte)로 메모리의 시작 주소값이 할당되는 것을 볼 수 있다.
이 글을 쓰는 이유는 지금 어디에서 발생하는 지도 모르는 메모리 침범으로 인하여 개발중인 응용프로그램이 불특정한 지점에서 죽어버린다는 것이다. 아무 환장하고 미칠 노름이다.
메모리 침범은 시간폭탄과 같은 것이다. 할당 하면 해제한다! 너무 기초적인것이다. 하지만 너무나도 중요하기에 말이 여기저기서 자꾸 나오는 것이다.
할당과 해제는 그나마 신경써서 잘하려고 노력하는 편이다.
String 처리 시. 예를들어, 일정한 크기의 배열에 임의의 String 값을 복사하는 경우 가급적 준비한 배열의 마지막은 '\0'으로 해주는 편이 좋다. 이것은 (SAFE_[Function name]) 함수들을 미리 준비해두어 사용하면 좋다.
두서없이 글을 썻네... 글을 보시는 분은 이해해주세요. 지금 많이 욱~ 해 있는 상태... 나중에 보고 정리할께요 ㅜ.ㅡ
결론, 1. string 관련 데이터 처리는 꼼꼼히 한다. -> SAFE_[ Function name ] 함수를 만들어 공용으로 쓰자.
2. new / delete , malloc / free 는 두세번 체크한다.
'비공개' 카테고리의 다른 글
클라이딩 컴퓨팅 & 서비스 (0) | 2011.02.16 |
---|---|
카드가 말하지 않는 23가지 (0) | 2011.01.27 |
vcredist_x86 (0) | 2011.01.10 |
fidder (0) | 2011.01.05 |
Dependency Walker (2) | 2011.01.05 |