ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • glibc detected double free or corruption
    2013. 6. 1. 2 comments

     double free or corruption


    오류 중 쉽다고 생각했던 double free or corruption 문제의 원인을 찾는데 엄청난 시간이 걸림을 경험하고 나니, 다른 분들도 이런 경우를 고려해 봤으면 하는 바람에서 >글을 적는다.


    double free or corruption 오류는 메모리 오류로써 두가지 발생 케이스가 있다.

    1. passing the same address to free twice 
    2. 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/




    반응형

    댓글 2

    • sr 2013.10.24 17:35

      좋은 글 감사히 잘 읽었습니다.
      overrunning an allocated area 이 부분에서 overrun은 어떤 상태인가요?

      본문 설명에는 더 큰 메모리를 사용하는 것이라고 되어있는데 감이 잘 안오네요. 예시 부탁드려요~

      • morenice 2013.10.28 14:54 신고

        예를 들어 영문 9글자를 메모리에 저장하려고 malloc으로 동적 메모리 할당을 10byte 받았다고 할 때(malloc을 사용하면 사용가능한 시작 주소값을 받게 되죠), 그 메모리에 10글자 이상을 쓰게 되면 할당받은 메모리 영역 그 이상으로 사용하게 됩니다. 넘어간 영역은 다른 곳에서 쓸수도 있는 공간일 수 있기 때문에 할당받은 또는 할당한 영역만을 사용하는 것이 중요합니다.

Designed by Tistory.