-
double free or corruption
오류 중 쉽다고 생각했던 double free or corruption 문제의 원인을 찾는데 엄청난 시간이 걸림을 경험하고 나니, 다른 분들도 이런 경우를 고려해 봤으면 하는 바람에서 >글을 적는다.
double free or corruption 오류는 메모리 오류로써 두가지 발생 케이스가 있다.
- passing the same address to free twice
- overrunning an allocated area before passing its address to free.
1번과 2번 모두 free라는 메모리 해제 시스템함수를 호출할 때 segfault가 발생합니다.
이런 문제를 만나면 일단 free가 두 번되는 경우가 있는지를 빠르게 찾고, 그 다음부터는 마음을 차분히 갖고(제일 중요) gdb를 통하여 segfault 발생 위치와 관련되어진 메모리의 크기를 검토해보면 원인이 파악한다.
내가 겪은 문제는 2번이다. free 함수에서 segfault가 발생하여 당연히 double free라고 생각했으나 결론적으로 사용해야 할 메모리 크기보다 더 크게 메모리를 사용하였고 free하는 순간 문제가 발생한 것이다.
문제는 외부 프로그램으로부터 요청을 받으면 정보를 제공하는 프로그램이었는데, 버전에 따라서 제공되는 메모리 크기가 달라지는 경우가 발생했다. 자신이 요청을 받았을 때 요청해 줄 데이터의 전체 크기를 체크하는 기능이 필요해 보였다. 예전 버전을 지원하지 못하는 것은 이해되나, 죽어버리면 곤란하기 때문이다.
See also- http://www.valgrind.org/
반응형TAG
좋은 글 감사히 잘 읽었습니다.
overrunning an allocated area 이 부분에서 overrun은 어떤 상태인가요?
본문 설명에는 더 큰 메모리를 사용하는 것이라고 되어있는데 감이 잘 안오네요. 예시 부탁드려요~
예를 들어 영문 9글자를 메모리에 저장하려고 malloc으로 동적 메모리 할당을 10byte 받았다고 할 때(malloc을 사용하면 사용가능한 시작 주소값을 받게 되죠), 그 메모리에 10글자 이상을 쓰게 되면 할당받은 메모리 영역 그 이상으로 사용하게 됩니다. 넘어간 영역은 다른 곳에서 쓸수도 있는 공간일 수 있기 때문에 할당받은 또는 할당한 영역만을 사용하는 것이 중요합니다.