KR20090112491A - 메모리 누수 검출 장치 및 방법 - Google Patents

메모리 누수 검출 장치 및 방법 Download PDF

Info

Publication number
KR20090112491A
KR20090112491A KR1020080038411A KR20080038411A KR20090112491A KR 20090112491 A KR20090112491 A KR 20090112491A KR 1020080038411 A KR1020080038411 A KR 1020080038411A KR 20080038411 A KR20080038411 A KR 20080038411A KR 20090112491 A KR20090112491 A KR 20090112491A
Authority
KR
South Korea
Prior art keywords
memory
information
procedure
state
leak
Prior art date
Application number
KR1020080038411A
Other languages
English (en)
Other versions
KR100965426B1 (ko
Inventor
이광근
정영범
Original Assignee
주식회사 파수닷컴
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 주식회사 파수닷컴 filed Critical 주식회사 파수닷컴
Priority to KR1020080038411A priority Critical patent/KR100965426B1/ko
Publication of KR20090112491A publication Critical patent/KR20090112491A/ko
Application granted granted Critical
Publication of KR100965426B1 publication Critical patent/KR100965426B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4434Reducing the memory space required by the program code
    • G06F8/4435Detection or removal of dead or redundant code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/32Monitoring with visual or acoustical indication of the functioning of the machine
    • G06F11/324Display of status information
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/06Addressing a physical block of locations, e.g. base addressing, module addressing, memory dedication
    • G06F12/0615Address space extension
    • G06F12/063Address space extension for I/O modules, e.g. memory mapped I/O

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)

Abstract

본 발명은 프로그램 소스로부터 메모리 누수에 관련된 정보를 효과적으로 선별 및 요약하도록 하여 경제성과 정밀도를 모두 만족시킬 수 있도록 한 메모리 누수 검출 장치 및 방법에 관한 것으로, 이를 위하여 메모리 누수를 발생시키는 메모리 설정 및 그에 따른 접근성을 체계화하여 정보가 필요한 경우들을 카테고리로 구분하고, 프로시저를 상기 카테고리에 따라 구분하여 요약하도록 함으로써, 메모리 누수가 발생 가능한 모든 경우를 포괄하면서도 거짓 경보를 필터링하기 위한 필수 정보들이 요약에 포함되도록 하는 효과가 있다.
Figure P1020080038411
프로그램 분석, 정적 분석, 메모리 누수, 에러 검출, 요약

Description

메모리 누수 검출 장치 및 방법{Memory Leak Detecting Apparatus and Method thereof}
본 발명은 메모리 누수 검출 장치 및 방법에 관한 것으로, 특히 프로그램 소스로부터 메모리 누수에 관련된 정보를 효과적으로 선별 및 요약하도록 하여 경제성과 정밀도를 모두 만족시킬 수 있도록 한 메모리 누수 검출 장치 및 방법에 관한 것이다.
프로그램 작성 시 발생되는 버그 중에서 그 발견이나 확인이 어려워 막대한 시간과 비용이 발생되는 디버깅 작업중 하나가 메모리 누수 분석 작업이라 할 수 있다. 즉, 문법이나 논리적 오류는 비교적 쉽게 검출이 되지만 방대한 프로그램 작업 중에 발생되는 사소한 메모리 할당과 해제, 얼라이어스(aliase) 등의 오류에 의한 메모리 누수는 검출이 쉽지 않아 그 발견이 늦어지는 경우가 많다. 특히, 메모리 누수에 의한 영향은 즉각적이기보다는 서서히 나타나지만 그 결과 메모리를 고갈시키고 프로그램을 멈추는 등의 치명적인 상황을 유발할 수 있기 때문에 프로그 램의 신뢰성에 막대한 영향을 주게 된다.
따라서, 이러한 메모리 누수를 확인하기 위해서 컴파일 후 메모리 상태를 직접 확인하는 방식이 활용되기도 하였으나, 이는 컴파일이 완료되어야 한다는 제한과 실제 오류가 발생한 위치나 내용을 확인하기 어렵다는 문제점이 있어 컴파일 되기 전의 프로그램 소스 상에서 메모리 누수를 확인하고자 하는 정적 분석(static analyzing) 방식이 등장하였다.
초기의 정적 분석 방식의 메모리 누수 분석기들은 정밀도를 높이기 위해서 소스를 그대로 활용하였으나 분석 시간이 오래 걸려 실용화가 어려웠기 때문에 소스를 모델링하여 모델링된 내용을 분석하는 방식을 통해 분석 시간을 단축하는 방식이 제안되었으며, 정적 분석 방식을 이용한 최근의 정적 분석 툴은 소스 코드를 프로시저별로 요약하여 해당 요약된 내용을 근거로 메모리 누수 가능성을 추정하는 방식으로 구현되고 있다.
하지만, 소스의 내용을 간략하게 요약할 경우 분석 시간은 줄어들지만 정밀도가 하락하고, 소스의 내용에 충실하게 요약할 경우 분석 시간이 너무 오래 걸려 경제성이 낮아지게 된다. 이러한 분석 시간 외에 메모리 누수 가능성을 지적하는 경고(alarm)의 수와 이러한 경고들 중에서 거짓 경고(false alarm)가 차지하는 비율 또한 메모리 누수 분석기의 성능을 판단하는 지표가 된다.
현재 발표된 대표적인 정적 분석툴은 속도에 치중하여 검출할 수 있는 메모리 누수의 종류가 제한되거나, 성능에 치중하여 속도가 느리거나 혹은 이들을 절충하여 적절한 속도와 검출 메모리 누수의 종류를 증가시켰으나 거짓 경고가 많은 제 한이 존재한다.
예를 들어, 현재 알려져 있는 정적 분석 툴 중에서 비교적 정밀한 것으로 알려져 있는 새턴(Saturn)의 경우 찾아낸 메모리 누수 경고 중 거짓 경고가 10% 정도로 비교적 높은 안정성을 나타내지만 소스 분석 속도가 초당 50라인 정도에 불과하여 방대한 소스에 적용할 경우 그 분석 속도가 너무 느리다.
다른 예로서, 콘트라딕션(Contradiction)의 경우 속도는 초당 300라인 정도로 비교적 양호하지만 찾아낸 메모리 누수 경고 중 거짓 경고가 56%에 이를 정도로 불안정하여 경고를 모두 확인하기 위해 불필요한 노력이 요구된다.
거짓 경고 확률을 적절히 하면서 속도를 높인 패스트체크(FastCheck)는 속도가 초당 37900라인에 이를 정도로 고속이고 거짓 경고 확률도 14% 정도로 비교적 양호하지만, 치명적인 메모리 누수들 중에서 일부 종류를 검출하지 못하기 때문에 신뢰성이 낮다.
따라서, 좀더 다양한 종류의 메모리 누수를 적절한 거짓 경고 수준으로 비교적 빠르게 얻을 수 있는 새로운 메모리 누수 검출 방식이 요구되고 있다.
상기와 같이 신뢰성 있는 메모리 누수 경고를 경제적으로 얻기 위해 새롭게 제공하는 본 발명 실시예들의 목적은 프로시저에서 메모리 누수에 관련 없는 경로 분석을 생략하면서 메모리 영향(memory effect)을 출구 메모리 상태(exit memory state) 정보를 포함하여 추정한 후, 메모리 누수에 관련된 정보를 복수의 기 설정된 카테고리로 구분하여 요약하도록 함으로써, 속도를 개선하고 메모리 누수에 관련된 정보를 적절히 포함한 요약 정보를 정해진 기준에 따라 효과적으로 생성할 수 있도록 한 메모리 누수 검출 장치 및 방법을 제공하는 것이다.
본 발명 실시예들의 다른 목적은 프로시저를 메모리 누수의 위험성을 판단하기 위한 정보를 얻는 카테고리들과 메모리 누수에 대한 거짓 경보를 필터링하기 위한 정보를 얻는 카테고리들로 이루어진 복수의 기 설정된 카테고리들에 따라 분류하도록 함으로써, 메모리 누수 분석에 필요한 정보를 구비한 요약을 효과적으로 생성하도록 한 메모리 누수 검출 장치 및 방법을 제공하는 것이다.
본 발명 실시예들의 또 다른 목적은 고정점 반복을 통해 루프를 분석함에 있어 메모리 상태 변화를 별도로 누적하도록 하여 고정점 반복을 통해 얻어지는 메모리 변화 상태를 보다 정밀하게 요약하여 메모리 누수 여부를 판단하도록 한 메모리 누수 검출 장치 및 방법을 제공하는 것이다.
본 발명 실시예들의 또 다른 목적은 루프 분석에 있어 해당 루프가 1회 이상 실행되는 것으로 가정하여 시작지점(initial edge) 정보와 종료지점(back edge) 정 보를 결합하지 않고 종료지점 정보만 갱신하는 방식으로 분석하도록 함으로써 거짓 경보를 줄일 수 있도록 한 메모리 누수 검출 장치 및 방법을 제공하는 것이다.
상기와 같은 목적을 달성하기 위하여, 본 발명의 일 실시예에 따른 메모리 누수 검출 장치는 소스 코드를 프로시저 단위로 구분하는 소스코드 공급부와; 상기 소스코드 공급부가 제공하는 프로시저에 대한 출구 메모리 상태(exit memory state)를 추정하여 해당 정보를 포함하는 메모리 상태 정보를 제공하는 메모리 영향 추정부와; 상기 메모리 영향 추정부가 제공하는 메모리 상태 정보를 이용하여 상기 프로시저를 기 설정된 메모리 누수 카테고리에 따라 구분하고 해당 카테고리에 속하는 메모리 영향을 요약하는 요약부; 상기 요약부를 통해 요약된 정보를 근거로 메모리 누수를 판단하여 경고를 생성하는 누수 분석부를 포함하여 이루어진다.
상기 메모리 영향 추정부는 접근 경로, 인수(argument)/전역 변수의 접근 가능성 및 해당 프로시저의 접근 가능성을 근거로 입력 메모리의 범위를 한정하는 해석부를 더 포함한다.
상기 요약부는 상기 메모리 영향 추정부가 제공하는 메모리 상태에 포함된 출구 메모리 상태로부터 외부 접근이 가능한 주소 정보를 수집하여 해당 주소의 종류를 할당(allocation), 해제(free), 얼라이어스(aliase) 중 하나로 분류하여 요약 정보에 포함시킨다.
상기 요약부의 기 설정된 메모리 누수 카테고리는 할당된 후 프로세서 외부에서 가시적이 되는 경우, 기 할당된 위치가 해제되거나 다른 얼리이어스에 의해 접근 가능하게 되는 경우, 얼라이어스 위치가 프로시저의 외부에서 가시적이 되는 경우들로 구분되며, 요약부는 상기 경우에 대해서만 요약을 기록한다.
상기 메모리 영향 추정부는 프로시저에 포함된 루프를 고정점 반복(fixpoint iteration)을 통해 루프에 대한 메모리 종료 상태를 추정하며, 상기 추정 과정에서 고정점 반복과 별도로 메모리 상태 변화를 누적 저장하는 고정점 반복부를 더 포함한다.
또한, 본 발명의 일 실시예에 따른 메모리 누수 검출 방법은 소스 코드를 프로시저 단위로 구분하면서 해당 프로시저의 입력 메모리 상태를 경로와 접근 가능성을 근거로 입력 메모리 상태 및 분석 경로를 한정하는 프로시저 해석 단계와; 상기 한정된 프로시저에서 상태가 변화된 메모리 주소와 출구 메모리 상태 정보를 포함하는 메모리 영향 정보를 추정하는 메모리 영향 판단 단계와; 상기 메모리 영향 정보를 근거로 상기 프로시저를 기 설정된 메모리 누수 카테고리로 구분하여 해당 카테고리에 속하는 메모리 영향을 요약하는 요약 단계와; 상기 요약된 정보를 근거로 메모리 누수를 분석하여 경고를 생성하는 누수 분석 단계를 포함하여 이루어진다.
상기 프로시저 해석 단계는 인수나 전역변수 또는 프로시저에 의해 접근 가능하며, 메모리 변화를 발생시키는 경로를 선택하도록 하는 입력 메모리 영역 만을 선택하는 단계를 포함한다.
상기 메모리 영향 판단 단계는 프로시저에 포함된 루프를 고정점 반복을 통해 루프에 대한 메모리 종료 상태를 추정하며, 상기 추정 과정에서 고정점 반복과 별도로 메모리 상태 변화를 누적 저장하여 이를 메모리 영향 정보에 포함시키는 단계를 더 포함한다.
상기 루프에 대한 메모리 종료 상태를 추정할 경우 상기 루프가 1회 이상 반복될 것으로 간주하여 루프의 시작지점 정보를 생략하고 종료지점 정보만을 이용하여 루프 종료시의 메모리 상태를 추정하는 단계를 더 포함한다.
상기 요약 단계의 기 설정된 메모리 누수 카테고리는 할당된 후 프로세서 외부에서 가시적이 되는 경우, 기 할당된 위치가 해제되거나 다른 얼리이어스에 의해 접근 가능하게 되는 경우, 얼라이어스 위치가 프로시저의 외부에서 가시적이 되는 경우들로 구분되며, 상기 요약 단계는 상기 경우들에 대해서만 요약을 기록한다.
본 발명의 실시예에 따른 메모리 누수 검출 장치 및 방법은 프로시저 분석시 메모리 누수에 관련 없는 경로의 분석을 생략하고, 적용 가능성에 따라 입력 메모리 범위를 한정하도록 하여 분석 속도를 높이는 효과가 있다.
본 발명의 실시예에 따른 메모리 누수 검출 장치 및 방법은 메모리 누수를 발생시키는 메모리 설정 및 그에 따른 접근성을 체계화하여 정보가 필요한 경우들을 카테고리로 구분하고, 프로시저를 상기 카테고리에 따라 구분하여 해당 카테고리별로 요약하도록 함으로써, 메모리 누수가 발생 가능한 모든 경우를 포괄하면서 도 거짓 경보를 필터링하기 위한 필수 정보들이 요약에 포함되도록 하는 효과가 있다.
본 발명 실시예에 따른 메모리 누수 검출 장치 및 방법은 고정점 반복을 통해 루프를 분석함에 있어 메모리 상태 변화를 별도로 누적하도록 하여 고정점 반복을 통해 얻어지는 메모리 변화 상태를 보다 정밀하게 요약하여 메모리 누수 여부를 판단하도록 함으로써, 분석 정밀도를 높이는 효과가 있다.
본 발명 실시예에 따른 메모리 누수 검출 장치 및 방법은 루프 분석에 있어 해당 루프가 1회 이상 실행되는 것으로 가정하여 시작지점 정보와 종료지점 정보를 결합하지 않고 종료지점 정보만 갱신하는 방식으로 동작 블록을 펼쳐서 분석하도록 함으로써 거짓 경보를 줄일 수 있는 효과가 있다.
상기한 바와 같은 본 발명을 첨부된 도면들과 실시예들을 통해 상세히 설명하도록 한다.
도 1은 메모리 누수를 효과적으로 분석하기 위해서 하나의 함수에 대응하는 소스 코드의 프로시저를 요약하고 이를 사례화(instantiation)하는 예를 보인 것이다. 여기서 '*'는 포인터를 의미하고 '!'는 메모리가 할당(allocation) 되었음을 의미한다.
좌측 하단에 요약 노드 다이어그램으로 도시한 바와 같이 함수 f는 if문에 의해서 분기되므로, 리턴(ret)에 의해서 메모리가 할당된 임의의 주소(빈 원)에 접 근할 수 있는 한가지 경로와, 인수(arg)가 자신이 접근할 수 있는 주소의 다음 주소(next)이며 메모리가 할당된 주소(빈 원)를 간접 접근할 수 있는 다른 경로로 구분되어 요약된다. 여기서, 실선 화살표는 프로시저 본문에 따른 관계에 대한 참조선이고, 점선 화살표는 해당 프로시저가 호출되기 전에 이미 존재하는 관계에 대한 참조선이다.
한편, 우측의 다이어그램과 같이 함수 g는 리턴에 의해서 메모리가 할당된 주소에 접근할 수 있는 단일 경로로 요약된다.
따라서, 중앙의 다이어그램과 같이 a=f(&k)를 사례화한 실제 프로세스가 요약된다. 즉, 리턴되는 a에 의해 메모리가 할당된 주소에 접근 가능한 경로와, &k에 의해 메모리가 할당된 주소의 이전 주소가 접근 가능한 경로로 요약되며, 상기 메모리 할당 주소들은 모두 리턴이나 인수에 의해 접근 가능하기 때문에 메모리 누수가 발생하지 않음을 알 수 있다.
메모리 누수 분석을 위해서는 우선 프로세스의 메모리 동작을 요약하고, 이러한 프로시저의 호출 위치에서 이러한 요약을 이용하도록 하여 소스 코드를 메모리 누수 관점에서 파악할 수 있도록 요약하는 절차가 선행되어야 하며, 이러한 요약에 의해 해당 프로세스 외부에서 상기 프로세스 수행 중에 할당된 메모리 주소가 접근 가능(즉, 가시적(visible))한지 여부를 파악한 후, 모든 할당된 메모리 주소가 접근 가능한 경우 메모리 누수가 없는 것으로 판단할 수 있다.
이러한 정적 메모리 누수 분석의 핵심은 효과적인 프로세서 요약에 있으며, 본 실시예에서는 이러한 프로세스 요약 시 메모리 누수 분석에 불필요한 경로를 요 약하지 않도록 하는 방식, 루프 구조를 한정된 시간 동안 더욱 정밀하게 요약하는 방식, 그리고, 모든 종류의 메모리 누수에 관련된 정보를 파악하여 각 상황에 맞추어 최적 요약하는 방식을 적용한다.
프로시저를 요약하는 방식으로 본 실시예에서는 우선 메모리 영향(memory effect)을 추정한 후, 이러한 추정을 메모리 누수를 식별하기 위한 정보를 포함하는 요약을 생성하는데 사용하는 순차적 방식을 이용한다.
도 2는 본 발명 실시예에 따른 메모리 누수 분석 장치의 구성을 보인 예로서, 도시한 바와 같이 소스 코드를 획득하는 소스코드 획득부(110)와, 상기 소스코드에서 프로시저를 구분하여 프로시저 단위로 코드를 제공하는 프로시저 단위 공급부(120)와, 메모리의 영향을 추정하여 메모리 상태 정보를 생성하는 메모리 영향 추정부(130)와, 상기 메모리 영향 추정부(130)가 제공하는 메모리 상태 정보를 이용하여 메모리 누수 분석을 위해 기 설정된 카테고리에 따라 프로시저를 구분한 후 해당 구분된 카테고리에 맞추어 최적 요약하는 요약부(140)와, 상기 요약부(140)를 통해 요약된 프로시저의 요약 정보를 이용하여 실제 프로시저가 호출된 지점을 사례별로 요약(instantiation)하는 사례화 적용부(150)와, 상기 사례화된 요약을 이용하여 메모리 누수를 판단하는 메모리 누수 판단부(160)와, 상기 메모리 누수 판단부(160)에 의해 누수가 의심되는 부분에 대한 경고를 누수 의심 정보와 함께 소정의 인터페이스를 통해 생성하여 사용자에게 제공하는 경고 생성부(170)를 포함하여 구성될 수 있다. 도시된 개별적 구성은 통합되거나 세분화될 수 있으며, 일부는 생략될 수도 있음에 주의한다. 한편, 상기 구성은 소프트웨어로 이루어진 기능 블 록에 의해 수행되거나 하드웨어적인 구성을 적어도 일부 이용하여 수행될 수도 있으므로 해당 구성은 물리적 구성이 아닌 논리적 구성으로 해석되어야 함은 당연하다.
상기 메모리 영향 추정부(130)는 상기 프로시저 단위 공급부(120)가 제공하는 프로시저에 대한 메모리 상태 정보를 생성하며, 상기 메모리 상태 정보는 할당(allocation) 주소와 해제(free) 주소 및 해당 프로시저를 종료했을 경우의 출구 메모리 상태(exit memeory state)를 포함한다. 상기 출구 메모리 상태는 입력 메모리의 범위와 외부 접근 가능한 주소 정보를 포함하여 프로시저 종료 시점의 메모리 상황을 입력 범위와 주소 정보를 통해 파악할 수 있도록 구성된다. 이는 출구 메모리 상태 생성부(133)에서 수행될 수 있다.
한편, 이러한 메모리 영향 추정을 위해서는 루프에 대한 처리가 요구되며, 본 실시예에서는 이러한 루프 추정을 경제적이면서도 정밀하게 처리하기 위해서 고정점 반복(Fixpoint Iteration) 방식과 반복 제한(k-bound)을 동시에 적용하면서 그에 따른 메모리 변화를 별도로 누적 정리하여 메모리 변화를 표현할 수 있는 요약식을 생성하도록 한다. 이를 통해 루프 본문의 반복 중의 메모리 변화에 따른 메모리 누수를 효과적으로 파악하면서도 거짓 경고를 필터링할 수 있다. 이는 고정점 반복부(132)에 의해서 수행될 수 있으며, 이러한 루프 요약 방식에 관해서는 이후 보다 상세히 설명할 것이다.
또한, 이러한 메모리 영향을 경제적으로 추정하기 위해서는 프로시저 만으로 알 수 없는 입력 메모리 범위에 대해서도 정의해 줄 필요가 있기 때문에, 본 실시 예에서는 접근 경로와 인수/전역변수의 접근 가능성 및 해당 프로시저의 접근 가능성을 근거로 입력 메모리의 범위를 한정하여 분석 범위를 한정할 수 있도록 한다. 이는 프로시저 해석부(131)에서 수행될 수 있으며, 필요한 경우 상기 프로시저 해석부(131)는 상기 고정점 반복부(132)와 출구 메모리 상태 생성부(133)의 동작을 지정하고 그에 대한 정보를 취합하여 출력하는 기능도 수행할 수 있다.
상기 메모리 영향 추정부(130)가 제공하는 메모리 관련 정보를 이용하여 프로시저를 요약하는 요약부(140)는 메모리 누수에 관한 정보를 제공할 수 있는 각 상황을 소정의 카테고리로 정의하고, 각 카테고리에 따라 상기 프로시저를 구분하는 카테고리 구분부(141)와, 상기 구분된 카테고리에 따라 프로시저를 요약하는 요약 생성부(142)를 포함할 수 있다. 한편, 상기 요약부(140)는 상기 메모리 영향 추정부(130)가 제공하는 정보 중 출구 메모리 상태 정보로부터 외부에서 접근 가능한 주소(인수, 전역 변수, 리턴에 의해 접근 가능한 주소)를 수집하여 해당 주소가 할당, 해제 또는 얼라이어스 중 어떠한 것인지 확인하여 그 결과를 프로시저 요약에 추가할 수 있다. 이는 카테고리 구분부(141)나 요약 생성부(142)에 의해 수행될 수 있으며, 경우에 따라서는 메모리 영향 추정부(130)에서 수행될 수도 있다.
이후 설명하겠지만, 상기 카테고리 구분부(141)는 프로시저에 의해 발생될 수 있는 모든 종류의 메모리 변화와 그에 따른 접근 방식의 쌍을 기준으로 하는 카테고리들 중에서 메모리 누수 분석에 불필요한 카테고리가 생략된 카테고리를 기준으로 프로시저를 구분한다. 이후, 요약 생성부(142)에서느 상기 프로시저로 구분된 메모리 영향 정보만 요약한다.
이제, 상기 설명된 각 구성에 대한 기본적인 동작 원리를 구체적인 예를 들어 설명하도록 한다.
먼저 메모리 영향을 추정하기 위한 방식에 관해 살펴본다. 상기 메모리 영향추정에 따라 제공되는 메모리 상태는 할당 주소, 해제 주소와 출구 메모리 상태로 이루어지며, 이를 통해 메모리 누수에 대한 직접적 분석도 가능하다.(본 실시예에서는 카테고리 분류를 통해 수행한다.)
상기 출구 메모리는 앞서 설명한 것과 같이 경로별 입력 메모리의 범위와 주소 정보들로 이루어지며, 이를 통해 외부 접근 가능한 주소들의 종류를 파악하여 프로시저 요약문에 요약함으로써 메모리 누수 판단에 활용할 수 있다.
출구 메모리 상태를 파악하기 위해서는 우선적으로 입력 메모리의 범위를 제한할 필요가 있다. 입력 메모리의 범위는 프로시저 분석 시 미리 정의되지 않기 때문에 최악의 경우 입력 메모리의 범위를 [-∞,∞]로 가정해야 할 수도 있다. 하지만, 본 실시예에서는 다음과 같은 기준으로 입력 메모리를 제한하는 것으로 입력 메모리에 대한 출력 메모리 상태를 얻을 수 있다. 먼저, 메모리 누수를 판단하기 위한 요약을 얻기 위한 것이므로 필요한 입력 메모리는 프로시저에 의해 접근 될 수 있어야 하고, 인수나 전역변수 중 하나로 접근 가능해야 한다는 기준에 의해 입력 메모리가 제한되며, 접근되는 주소는 몰라도 접근되는 경로는 알 수 있기 때문에 경로에 따라 입력 메모리의 범위를 한정할 수 있다.
도 3은 도 1과 같은 프로시저를 본 발명의 실시예에 따라 해석하여 메모리 영향을 추정할 경우 얻어지는 출구 메모리 상태를 나타낸 것으로, 도시한 바와 같이 2종류의 경로에 대해 각각 출구 메모리 상태가 달리 얻어진다.
먼저, 첫번째 경로(if문의 true 경로)에 대한 출구 메모리 상태를 얻기 위한 입력 메모리(n)의 범위는 그 경로에 의해서 0을 제외한 [-∞, -1][1,∞]로 한정된다. 이러한 범위에 대한 출구 메모리 상태는 리턴에 의해서 메모리가 할당된 주소(l1)에 접근 가능하다는 것으로 정리된다. 즉, 해당 경로의 접근 위치는 n과 리턴(ret)이며, 리턴의 위치는 malloc(4)의 심볼 위치를 나타내는 l1이다. 이러한 심볼 위치(l1)는 사례화를 통해 해당 f함수를 호출하는 위치에서 마다 새로운 심볼 위치로 대체된다.
두번째 경로(if문의 false 경로)에 대한 출구 메모리 상태를 얻기 위한 입력 메모리(n)의 범위는 그 경로에 의해서 [0,0]으로 한정되며, 상기 경로의 접근 위치는 n, p, α.next, 그리고 리턴(ret)이 된다. 여기서, α는 현재는 알 수 없으나 해당 함수가 호출 위치에서 사례화 될 경우 결정되는 파라메터이다. α.next는 입력 메모리가 접근할 수 있는 위치를 경유한 경로로서, 해당 위치(l2)는 malloc(10)의 심볼 위치이며 함수 f가 사례화될 때마다 갱신되는 주소이다.
이러한 출구 메모리 상태를 통해서 프로시저 외부에서 접근 가능한 접근 위치를 프로시저 요약으로 표현할 수 있다. 한편, 이를 통해서 외부에서 접근 가능한 위치가 전역 변수를 통한 것인지, 포인터 인수를 통한 것인지 또는 리턴 값을 통한 것인지를 파악할 수 있으며, 이를 통해 해당 프로시저에 대한 메모리 행동을 알 수 있다.
정리하자면, 상기 예에서, 두개의 출구 메모리 상태로부터 해당 프로시저 외부에서 접근 가능한 위치(l1,l2)는 n(전역 변수에 의해서), p(포인터 인수에 의해서), 리턴(리턴 값에 의해서)을 통해 접근 가능하다. 따라서, 앞서 도 1의 f 요약과 같은 노드 다이어그램으로 요약될 수 있다.
만일, 상기 경로들 중에서 메모리 변화에 관련된 내용이 존재하지 않은 경로가 있을 경우, 본 실시예에서는 해당 경로는 요약하지 않고 무시한다. 예를 들어, 함수 f에서 n이 true인 경우의 경로가 return malloc(4)가 아니라 return 1과 같다면 n이 true인 경로는 요약 대상에서 배제함으로써 정밀도에 영향을 주지 않으면서 분석 속도를 높일 수 있다.
도 4는 요약된 프로시저를 사례화하는 예를 보인 것으로, 그 간단한 사용 방식은 요약 다이어그램의 비어있는 원을 호출 위치의 메모리 상태로부터 얻어지는 주소 정보로 채우는 것이라 할 수 있다.
먼저 좌측의 함수 f를 보면, 간단히 x에 대응하는 주소에 할당된 메모리를 해제하고, y의 다음 주소에 할당된 메모리를 해제하는 것임을 알 수 있다. 그에 따른 요약은 좌측 하단과 같이 인수1(arg1)이 대응된 주소가 해제되고, 인수2(arg2)에 대응되는 주소의 다음 주소가 해제됨을 나타내는 다이어그램임을 알 수 있다. 여기서 '원형 화살표'는 할당된 주소를 해제하는 것을 의미한다.
여기서 함수 g에 적용되는 실제 함수 f의 사용 예인 f(a, b)의 사용 지점에 대한 메모리 상태를 파악하기 위해 해당 함수를 살펴보면, *a는 malloc(10)에 의해 메모리가 할당되었고 *b는 a와 같으므로 동일 주소를 가리키며, a의 다음 주소가 malloc(10)에 의해 메모리가 할당되었음을 알 수 있다. 따라서, f(a,b)에서의 메모리 상태는 도시된 중간 표와 같이 a와 b는 심볼 위치(l1)를 지시하고, a의 다음 주소인 l1.next는 심볼 위치(l2)를 지시하는 상태임을 알 수 있다.
따라서, f(a,b)에 대한 사례화된 요약은 우측의 노드 다이어그램과 같이 인수 대신 각각 a와 b가 대입되고, 빈 원에는 각각 심볼 위치가 대응된다.
이러한 요약을 통해 메모리가 할당된 모든 주소에 대한 해제가 수행되어 메모리 누수가 발생하지 않음을 알 수 있다.
상기 설명한 내용을 통해서 메모리 영향을 추정하여 기본적인 요약을 생성하고, 이를 호출 위치에 따라 사례화하는 방식에 관해 살펴보았다. 하지만, 본 실시예에서는 메모리 누수에 관련되는 모든 상황들 중에서 메모리 누수를 추정하는데 필요한 정보를 얻을 수 있는 상황을 선택하여 카테고리화 한 후 메모리 영향 추정 정보를 활용하여 메모리 누수에 관련된 동작을 수행하는 프로시저를 해당 카테고리에 따라 구분하도록 하고, 해당 카테고리별에 해당하는 메모리 영향만 요약하도록 함으로써 메모리 누수에 관련된 모든 상황을 포괄함과 아울러 필요한 정보가 요약에 포함되도록 하여 정밀도를 높이고 거짓 알람을 필터링할 수 있도록 할 것이다.
도 5는 본 발명 일 실시예에 따른 프로시저 요약 카테고리를 보인 것이다. 여기서는 C언어를 예로 들어 설명하지만 다른 언어의 경우에도 해당 언어의 문법에 따라 동일한 원칙으로 카테고리를 설정할 수 있으므로, 본 발명은 C언어로 제한되는 것이 아님에 주의한다.
C언어에서 메모리 누수 영향을 분석하는 것은 프로시저 외부에서 해당 프로시저에 의해 변화된 메모리 영향이 가시적인지를 분석하는 것이라 할 수 있다. 즉, 프로시저 내부에서 메모리가 할당된 주소를 해당 프로시저 외부에서 접근할 수 없다면(즉, 가시적이지 않다면) 메모리 누수가 발생할 가능성이 높은 것으로 분석할 수 있다.
프로시저의 메모리 누수 관련 영향을 분석하기 위해서 할당(allocation), 재할당(deallocation) 그리고 얼라이어스(alias) 정보가 필요하다. 달리 말하면 프로시저 내부에서 메모리 할당이 이루어진 주소가 외부에 가시적인지를 파악하면 되고, 해당 할당된 메모리가 해제되거나 얼라이어스된 경우 가시적이라 한다.
따라서, 좌측의 항목은 프로시저 내부에서 이루어질 수 있는 메모리 변화의 종류이고, 상단의 항목은 외부에서 접근 가능한 경우의 종류들이다. 이러한 12가지 카테고리를 통해서 C언어의 모든 메모리 누수 관련 정보를 포함하는 프로시저를 구분할 수 있다.
본 실시예에서는 이러한 카테고리들 중에서 할당된 후 해제된 것이나 할당된 후 전역 변수로 접근 가능한 것, 그리고 전역 변수로 할당되어 해제되거나 전역 변수로 접근 가능한 것은 메모리 누수에 관한 분석에서는 큰 의미가 없기 때문에 생략한다.
따라서, 프로시저 요약은 도시된 8개의 카테고리로 한정할 수 있게 된다. 즉, 상기 카테고리는 통해 제공되는 외부에서 접근 가능한 위치들, 할당되거나 해제된 위치들의 세트에 대한 정보를 통해서 메모리 누수 가능성을 분석하고, 거짓 경보를 필터링할 수 있다.
상기 8개 카테고리의 의미를 살펴보면, 할당된 후 프로세서 외부에서 가시적이 되는 경우, 기 할당된 위치가 해제되거나 다른 얼라이어스에 의해 접근 가능하게 되는 경우, 얼라이어스 위치가 프로시저의 외부에서 가시적이 되는 경우로서 이러한 경우들은 메모리 누수를 분석하는데 필요한 정보를 포함하고 있기 때문에 이러한 8가지 카테고리에 대응되는 메모리 영향을 요약으로 기록해야 한다.
우선 할당된 후 프로세서 외부에서 가시적이 되는 경우는 할당된 위치들이 리턴(Alloc2Ret)되는 경우나 인수로부터 위치가 할당(assign)되는 경우(Alloc2Ret)이며, 이러한 경우에 대해서는 요약을 기록해야 한다. 할당된 위치가 전역 변수에 의해 접근 가능한 경우는 프로그램의 어느 위치에서도 가능하므로 해당 경우는 요약을 기록하지 않아도 된다.
그리고, 기 할당된 위치가 해제되거나 다른 얼라이어스에 의해 접근 가능하게 되는 경우로서 프로시저 호출 전에 할당된 위치가 프로시저 내부에서 가시적인 경우는 포인터 인수나 전역 변수를 통해 접근하는 경우이므로 이러한 인수에 의한 접근을 위해서 위치가 명백하게 해제되는 경우(Arg2Free)와 리턴 값에 의해 위치가 접근 가능해 지는 경우(Arg2Ret)의 요약을 기록해야 하며, 인수가 전역 변수에 의해 접근 가능한 위치로 할당되는 경우(Arg2Glob)나 다른 인수에 의해 접근 가능한 위치로 할당되는 경우(Arg2Arg)의 요약을 기록해야 한다. 할당된 위치가 전역 변수에 의해 접근 가능하게 된 경우는 기록하지 않는다.
마지막으로, 얼라이어스 위치가 프로시저의 외부에서 가시적이 되는 경우는 거짓 경고를 방지하기 위해서 해당 위치가 전역 변수, 포인터 인수 그리고 리턴 값에 의해 외부에서 접근 가능한 위치라는 것을 기록해야 한다. 이러한 3가지 경우의 위치 간의 얼라이어스는 상호 할당(assignment)에 의해 발생되며, 9가지 경우가 존재한다. 하지만, 이러한 경우 중에서 리턴값이 얼라이어스되는 경우(리턴값이 전역, 인수, 리턴에 의해 접근 가능한 3가지 경우)는 불가능한 경우이고, 전역 변수가 전역 변수에 의해 접근 가능한 경우(Glob2Glob)는 메모리 누수 분석에는 관련이 없기 때문에 다음의 5가지 경우에 대해서만 고려하면 된다. 먼저, 전역 변수로 접근 가능한 위치를 인수로 접근 가능한 위치로 할당한 경우(Glob2Arg)나 리턴값으로 접근 가능한 위치로 할당한 경우(Glob2Ret), 인수로 접근 가능한 위치를 전역 변수로 접근 가능하도록 할당한 경우(Arg2Glob)나 다른 인수로 접근 가능하도록 할당한 경우(Arg2Arg)나 리턴 값으로 접근 가능하도록 할당한 경우(Arg2Ret)이다. 여기서 3가지 경우(Arg2Glob, Arg2Arg, Arg2Ret)는 이미 앞서 재할당 영향을 기록하기 위해서 사용된 것이다.
따라서, 프로시저를 이러한 8가지 카테고리들로 구분하여 해당 카테고리에 속하는 경우에만 요약을 기록하도록 하면 C언어에 의해 발생할 수 있는 메모리 영향들 중 메모리 누수 분석에 필요한 모든 경우의 정보를 요약할 수 있다.
도 6내지 도 11은 상기 8가지 카테고리에 해당하는 경우의 예를 보인 것으 로, 도시되는 노드 다이어그램은 요약을 나타낸 것으로 각 노드는 요약된 노드를 의미하며 원은 힙 위치(heap location)(동적으로 할당되는 주소들), 사각형은 스택 위치(변수, 인수, 전역 변수)를 의미한다.
도 6은 상기 카테고리 중에서 Arg2Free의 경우로 구분되는 프로시저의 예를 보인 것으로, 도시한 바와 같이 해당 프로시저는 인수로 접근 가능한 주소를 해제하는 경우로서, 도시된 노드 다이어그램처럼 요약된다.
도 7은 상기 카테고리 중에서 Arg2Glob와 Glob2Arg의 경우로 구분되는 프로시저의 예를 보인 것으로, 도시한 바와 같이 해당 함수(attachGlob)는 인수에 의해 접근 가능한 위치를 전역 변수로 붙이고, 전역 변수로 접근 가능한 위치를 인수로 붙인 예를 보인다. 첫번째 인수(arg1)와 원을 점선 화살표로 연결한 것이 Arg2Glob를 나타내고, 두번째 인수(arg2)와 연결된 실선 화살표가 Glob2Arg를 나타낸다.
도 8은 상기 카테고리 중에서 Alloc2Arg의 경우로 구분되는 프로시저의 예를 보인 것으로, 할당된 주소를 포인터 인수(p)에 붙인 경우이다. 실제 C 언어 프로그램에서 이러한 경우가 발생할 경우 메모리 누수가 자주 발생된다.
도 9는 상기 카테고리 중에서 Alloc2Ret의 경우로 구분되는 프로시저의 예를 보인 것으로, 해당 프로시저(make2List)는 길이가 2인 할당 리스트를 리턴하는 경우이다. 실제 C 언어 프로그램에서 많은 오브젝트들이 프로시저 호출을 통해 할당(allocation)되며, 이는 할당된 힙(heap) 오브젝트를 리턴하는 가장 일반적인 방식이다.
도 10은 상기 카테고리 중에서 Glob2Ret와 Arg2Arg의 경우로 구분되는 프로 시저의 예를 보인 것으로, 제 2인수가 제 1인수로 주소를 전달하며, 전역 포인터를 리턴하는 경우이다. 이러한 오브젝트에 붙여지는 할당된 주소는 메모리 누수로 경고되어서는 안된다. 즉, 거짓 경고를 필터링하기 위해 기록되어야 하는 정보이며, 예를 들어 리눅스(Linux) 커널의 어떤 프로시저들은 전역 테이블로부터 오브젝트를 리턴하기도 하므로 이러한 경우를 메모리 누수로 잘못 경고할 경우 신뢰성이 낮아지게 된다. 따라서, 인수에서 인수로 주소가 전달되는 경우에는 해당 정보를 반드시 기록해야 하며 이를 통해 분석시 인수들 간의 얼라이어스를 파악할 수 있다.
도 11은 상기 카테고리 중에서 Arg2Ret의 경우로 구분되는 프로시저의 예를 보인 것으로, 인수로 접근 가능한 주소를 리턴하는 경우를 보인 것이다. C언어의 라이브러리 함수들 중 일부(예를 들어 'memcpy', 'strcpy' 등)는 포인터 인수를 리턴한다. 도시된 경우 변수 ret와 포인터 인수 lst는 공통으로 접근 가능한 위치를 공유한다. 따라서, 이러한 내부적인 얼라이어스에 관한 정보 역시 반드시 저장되어야 신뢰성을 높일 수 있다.
도 12와 도 13은 앞서 설명한 프로시저 요약들이 간단한 C 코드에 대해 사례화되는 지를 예를 들어 보이기 위한 것으로, 도 12는 간단한 C 코드로서, 함수 Clean()에 관한 것이다.
이러한 도 12의 코드에서는 앞서 설명한 예들의 함수가 포함되며, 앞서 프로시저 요약된 내용을 실제 호출 위치에 적용하는 것으로 해당 코드는 도 13과 같이 요약될 수 있다.
도 12의 3번째 라인의 함수인 make2List는 도 9의 요약을 이용할 수 있고, 4 번째 라인의 함수는 도 11의 요약을 이용할 수 있으며, 5번째 라인의 함수는 도 7의 요약을 이용할 수 있다. 그리고, 6번째 라인의 함수는 도 6의 요약을, 7번째 라인의 함수는 도 8의 요약을, 그리고 8번째 라인의 함수는 도 10의 요약을 이용할 수 있다. 이러한 요약들을 각각 개별적인 변수들(lst1, lst2, lst3, lst4, p)로 사례화하면 도 13과 같은 요약을 얻을 수 있다.
해당 요약을 분석할 경우 모든 할당된 세트들이 전역 포인터 변수에 의해 접근 가능한 것을 알 수 있으므로, 해당 코드(clean())은 메모리 누수가 없는 것으로 분석될 수 있다.
상기 설명과 같이 메모리 누수에 관련된 8개의 카테고리에 해당하는 프로시저들을 요약하여 이들을 해당 프로시저가 호출되는 위치에 이용하도록 할 경우 메모리 누수에 관련된 정보들을 효과적으로 요약할 수 있게 된다.
한편, 상기와 같은 방식의 프로시저 분석에 있어서, 보다 신뢰성을 높이기 위한 방안으로 본 실시예에서는 메모리 영향 추정시 고려되어야 하는 루프 분석을 다소 변형하여 충분한 메모리 누수 관련 정보를 포함하는 요약을 얻을 수 있도록 한다. 앞서 8가지 카테고리를 설명하면서 거짓 경고를 줄이기 위해서 프로시저의 내부 프로시저(interprocedure)에서 발생되는 얼라이어싱에 대한 정보를 반드시 기록해야 한다고 설명한 바 있다. 이와 유사한 관점에서 기존의 루프 분석이 단순한 제한 횟수 반복(k-bound)이나 고정점 반복(Fixpoint Iteration) 방식에 의해 결과 정보만을 요약함으로써, 내부 반복 과정에서 발생되는 메모리 영향을 메모리 누수 분석시 충분히 고려할 수 없어 거짓 경고의 발생 빈도가 높아지는 것을 방지할 필요가 있다.
따라서, 본 실시예에서는 루프 분석시 기본적으로 고정점 반복 방식을 이용하되, 횟수를 제한하여 일정 이상 반복되지 않도록 하여 경제성을 유지하도록 함과 아울러 루프의 반복 과정에서 발생되는 메모리의 변화들을 누적하여 요약하도록 하는 것으로 실제 루프의 반복은 고정점 반복 방식에 의해 수행되도록 하고, 해당 루프의 요약은 메모리 변화들을 별도로 누적한 것을 이용하도록 한다. 이를 위해서 메모리의 상태 천이 상황을 효과적으로 요약할 수 있는 요약 도메인(abstract domian) 상의 요약문을 정의하고, 이러한 요약을 반복 단위로 결합하도록 하여 간단한 요약문을 통해 메모리 누수에 관련된 정보의 변화 과정을 확인할 수 있도록 함으로써 메모리 누수 상태를 보다 정확하게 파악할 수 있다.
이러한 누적 메모리 영향 기록 방식 외에, 본 실시예에 따른 루프 분석의 경우 발견적(heuristic) 정보를 도입하여 분석의 신뢰성을 높이기 위하여 루프를 펼칠 경우 루프의 시작지점(initial edge)과 종료지점(back edge)을 결합하지 않고 종료지점 정보만을 갱신하도록 하는 방식을 이용한다. 즉, 실제 프로그램에 적용되는 루프는 적어도 1번은 수행된다는 경험적이고 발견적 관점에서 루프의 시작 지점 상태 집합과 루프의 종료지점 상태 집합을 결합하지 않도록 하여 실제 종료 지점의 상태 정보를 보다 실제에 가깝게 한정할 수 있게 된다.
도 14는 일반적인 루프의 해석 예를 보인 것으로 도시한 바와 같이 좌측의 루프 코드는 실제 우측과 같은 내용을 가진 것으로, 우측의 블록에는 각각 상태를 <할당(allocation), 해제(free)>의 집합으로 나타낸다.
먼저, 루프의 시작지점에서, p에대한 할당이 발생되므로 시작지점의 정보는 <{l},Ø>이 된다. 즉, 주소l이 할당되었으며 해제되지 않았다는 의미이다.
루프의 본문에서, n과 m의 값에 따라 그 상태가 그대로 종료지점에서 리턴될 수 있고, 할당된 p가 해제된 후 종료지점에서 리턴될 수 있으므로, 할당된 p가 해제된 경우 종료지점의 정보는 <Ø,{l}>이 된다. 하지만, 일반적인 경우 시작지점의 정보와 종료지점의 정보를 결합하기 때문에 실제 얻어지는 출력 메모리 상태는 도시한 바와 같이 <{l},{l}>이 된다.
하지만, 앞서 설명한 바와 같이 대부분의 루프는 적어도 한번은 실행되도록 프로그램하는 것이 상식이기 때문에 실제 출력 메모리 상태는 p가 해제된 상태의 경우에 따른 <Ø,{l}>이 될 확률이 대단히 높다.
따라서, 본 실시예에서는 루프를 해석할 경우 시작지점의 정보를 종료지점의 정보와 결합하지 않도록 하여 거짓정보를 줄일 수 있다.
결과적으로 앞서 설명한 바와 같이 입력 메모리 영역을 제한하고 불필요한 경로를 배제하여 분석 속도를 높이고, 기 설정한 카테고리에 따른 프로시저만 요약하면서도 메모리 누수 발견과 거짓 경보 필터링에 필요한 정보들을 충분히 포함하도록 함과 아울러, 루프 분석에서도 메모리 변화 과정에 따른 정보들을 기록하고 발견적인 거짓 경보 필터링 구성을 적용하여 적절한 거짓경보 수준을 가지면서 대부분의 메모리 누수에 대한 경보를 빠른 속도로 제공할 수 있는 정적 분석 툴을 제 공할 수 있다. 본 실시예에 따를 경우 초당 720라인 정도의 분석 속도로 12% 정도의 거짓 알람이 포함된 메모리 누수 경고를 제공할 수 있으며, 동일한 대상에 대해 시험(널리 알려져 있는 벤치마크 툴인 SPEC2000에 의한 벤치 마크)해 본 결과 패스트체크(FastCheck)에 의해서는 검출되는 거의 대부분의 실제 메모리 누수를 검출하면서도 패스트체크에 의해서 검출되지 않는 실제 메모리 누수들도 약 35% 정도 더 검출하는 높은 신뢰성을 보였다. 이러한 실제 메모리 누수들에 대한 검출 정도는 다른 툴들에 대비해서도 높게 유지되었으며 패스트체크를 제외한 다른 툴 들에 비해 적어도 40% 이상 빠른 속도를 제공한다.
이상에서는 본 발명에 따른 바람직한 실시예들에 대하여 도시하고 또한 설명하였다. 그러나 본 발명은 상술한 실시예에 한정되지 아니하며, 특허 청구의 범위에서 첨부하는 본 발명의 요지를 벗어남이 없이 당해 발명이 속하는 기술 분야에서 통상의 지식을 가진 자라면 누구든지 다양한 변형 실시가 가능할 것이다.
도 1은 프로시저 요약 및 적용 과정을 설명하기 위한 개념도.
도 2는 본 발명 일 실시예에 따른 메모리 누수 검출 장치의 블록 다이어그램.
도 3은 본 발명 실시예에 따른 출구 메모리 상태를 나타내는 표.
도 4는 본 발명 실시예에 따른 요약의 사례화 방법을 설명하는 개념도.
도 5는 본 발명 일 실시예에 따른 카테고리 구분 표.
도 6은 내지 도 11은 본 발명 실시예에 따른 카테고리별 요약 예를 보인 개념도.
도 12는 본 발명 실시예를 설명하기 위한 예제 코드.
도 13은 본 발명 실시예를 설명하기 위한 요약 노드 다이어그램.
도 14는 루프 분석을 설명하기 위한 개념도.
** 도면의 주요 부분에 대한 부호의 설명 **
110: 소스코드 획득부 120: 프로시저 단위 공급부
130: 메모리 영향 추정부 131: 프로시저 해석부
132: 고정점 반복부 133: 출구 메모리 상태 생성부
140: 요약부 141: 카테고리 구분부
142: 요약 생성부 150: 사례화 적용부
160: 메모리 누수 판단부 170: 경고 생성부

Claims (24)

  1. 소스 코드를 프로시저 단위로 구분하는 소스코드 공급부와;
    상기 소스코드 공급부가 제공하는 프로시저에 대한 출구 메모리 상태(exit memory state)를 추정하여 해당 정보를 포함하는 메모리 상태 정보를 제공하는 메모리 영향 추정부와;
    상기 메모리 영향 추정부가 제공하는 메모리 상태 정보를 이용하여 상기 프로시저를 기 설정된 메모리 누수 카테고리에 따라 구분하고 해당 카테고리에 속하는 메모리 영향을 요약하는 요약부와;
    상기 요약부를 통해 요약된 정보를 근거로 메모리 누수를 판단하여 경고를 생성하는 누수 분석부를 포함하여 이루어지는 메모리 누수 검출 장치.
  2. 청구항 1에 있어서, 상기 메모리 영향 추정부는 프로시저의 경로를 획득하여 메모리를 변화시키지 않는 경로를 생략하는 해석부를 더 포함하는 메모리 누수 검출 장치.
  3. 청구항 1에 있어서, 상기 메모리 영향 추정부는 메모리가 할당된 주소 및 해제된 주소 정보를 수집하여 상기 메모리 상태 정보에 더 포함하는 메모리 누수 검 출 장치.
  4. 청구항 1에 있어서, 상기 메모리 영향 추정부는 접근 경로, 인수(argument)/전역 변수의 접근 가능성 및 해당 프로시저의 접근 가능성을 근거로 입력 메모리의 범위를 한정하는 해석부를 더 포함하는 메모리 누수 검출 장치.
  5. 청구항 1에 있어서, 상기 요약부는 상기 메모리 영향 추정부가 제공하는 메모리 상태에 포함된 출구 메모리 상태로부터 외부 접근이 가능한 주소 정보를 수집하여 해당 주소의 종류를 할당(allocation), 해제(free), 얼라이어스(aliase) 중 하나로 분류하여 요약 정보에 포함시키는 메모리 누수 검출 장치.
  6. 청구항 1에 있어서, 상기 요약부의 기 설정된 메모리 누수 카테고리는 메모리 할당(allocation), 전역 변수 및 인수 설정에 의해 점유되는 메모리의 외부 접근 가능 상태를 기준으로 구분되는 메모리 누수 검출 장치.
  7. 청구항 6에 있어서, 상기 점유되는 메모리의 후속 접근 가능 상태는 해당 메 모리 할당이 해제된 상태, 전역 변수, 인수 또는 리턴에 의해 접근 가능한 상태 중 하나인 메모리 누수 검출 장치.
  8. 청구항 1에 있어서, 상기 요약부의 기 설정된 메모리 누수 카테고리는 할당된 후 프로세서 외부에서 가시적이 되는 경우, 기 할당된 위치가 해제되거나 다른 얼리이어스에 의해 접근 가능하게 되는 경우, 얼라이어스 위치가 프로시저의 외부에서 가시적이 되는 경우들로 구분되며, 요약부는 상기 경우에 대해서만 요약을 기록하는 메모리 누수 검출 장치.
  9. 청구항 1에 있어서, 상기 요약부의 메모리 누수 카테고리는 8개 카테고리인 메모리 누수 검출 장치.
  10. 청구항 1에 있어서, 상기 요약부는 상기 기 설정된 메모리 누수 카테고리 별로 기 설정된 정보를 포함하도록 기 설정된 요약문 형식에 따라 기 설정된 정보를 추출하여 요약문을 생성하는 메모리 누수 검출 장치.
  11. 청구항 1에 있어서, 상기 메모리 영향 추정부는 프로시저에 포함된 루프를 고정점 반복(fixpoint iteration)을 통해 루프에 대한 메모리 종료 상태를 추정하며, 상기 추정 과정에서 고정점 반복과 별도로 메모리 상태 변화를 누적 저장하는 고정점 반복부를 더 포함하는 메모리 누수 검출 장치.
  12. 청구항 11에 있어서, 상기 고정점 반복부는 상기 루프가 1회 이상 반복될 것으로 간주하여 루프의 시작지점 정보를 생략하고 종료지점 정보만을 이용하여 루프 종료시의 메모리 상태를 추정하는 메모리 누수 검출 장치.
  13. 청구항 12에 있어서, 상기 고정점 반복부는 기 설정된 반복 횟수를 초과하지 않도록 설정되는 메모리 누수 검출 장치.
  14. 소스 코드를 프로시저 단위로 구분하면서 해당 프로시저의 입력 메모리 상태를 경로와 접근 가능성을 근거로 입력 메모리 상태 및 분석 경로를 한정하는 프로시저 해석 단계와;
    상기 한정된 프로시저에서 상태가 변화된 메모리 주소와 출구 메모리 상태 정보를 포함하는 메모리 영향 정보를 추정하는 메모리 영향 판단 단계와;
    상기 메모리 영향 정보를 근거로 상기 프로시저를 기 설정된 메모리 누수 카테고리로 구분하여 해당 카테고리에 속하는 메모리 영향을 요약하는 요약 단계와;
    상기 요약된 정보를 근거로 메모리 누수를 분석하여 경고를 생성하는 누수 분석 단계를 포함하여 이루어지는 메모리 누수 검출 방법.
  15. 청구항 14에 있어서, 상기 프로시저 해석 단계는 인수나 전역변수 또는 프로시저에 의해 접근 가능하며, 메모리 변화를 발생시키는 경로를 선택하도록 하는 입력 메모리 영역 만을 선택하는 단계를 더 포함하는 메모리 누수 검출 방법.
  16. 청구항 14에 있어서, 상기 메모리 영향 판단 단계는 프로시저에 포함된 루프를 고정점 반복을 통해 루프에 대한 메모리 종료 상태를 추정하며, 상기 추정 과정에서 고정점 반복과 별도로 메모리 상태 변화를 누적 저장하여 이를 메모리 영향 정보에 포함시키는 단계를 더 포함하는 메모리 누수 검출 방법.
  17. 청구항 16에 있어서, 상기 루프에 대한 메모리 종료 상태를 추정할 경우 상기 루프가 1회 이상 반복될 것으로 간주하여 루프의 시작지점 정보를 생략하고 종료지점 정보만을 이용하여 루프 종료시의 메모리 상태를 추정하는 단계를 더 포함 하는 메모리 누수 검출 방법.
  18. 청구항 16에 있어서, 상기 고정점 반복은 기 설정된 반복 횟수를 초과할 경우 종료하는 메모리 누수 검출 방법.
  19. 청구항 14에 있어서, 상기 요약 단계의 기 설정된 메모리 누수 카테고리는 메모리 할당(allocation), 전역 변수 및 인수 설정에 의해 점유되는 메모리의 외부 접근 가능 상태를 기준으로 구분되는 메모리 누수 검출 방법.
  20. 청구항 19에 있어서, 상기 점유되는 메모리의 후속 접근 가능 상태는 해당 메모리 할당이 해제된 상태, 전역 변수, 인수 또는 리턴에 의해 접근 가능한 상태 중 하나인 메모리 누수 검출 방법.
  21. 청구항 14에 있어서, 상기 요약 단계는 상기 메모리 영향 판단 단계에서 얻어진 출구 메모리 상태로부터 외부 접근 가능성이 있는 주소 정보를 수집하여 해당 주소의 종류를 할당(allocation), 해제(free), 얼라이어스(aliase) 중 하나로 구분 하여 요약 정보에 삽입하는 단계를 포함하는 메모리 누수 검출 방법.
  22. 청구항 14에 있어서, 상기 요약 단계의 기 설정된 메모리 누수 카테고리는 할당된 후 프로세서 외부에서 가시적이 되는 경우, 기 할당된 위치가 해제되거나 다른 얼리이어스에 의해 접근 가능하게 되는 경우, 얼라이어스 위치가 프로시저의 외부에서 가시적이 되는 경우들로 구분되며, 상기 요약 단계는 상기 경우들에 대해서만 요약을 기록하는 메모리 누수 검출 방법.
  23. 청구항 14에 있어서, 상기 요약 단계의 기 설정된 메모리 누수 카테고리는 8개인 메모리 누수 검출 방법.
  24. 청구항 14에 있어서, 상기 요약 단계는 상기 기 설정된 메모리 누수 카테고리 별로 기 설정된 정보를 포함하도록 기 설정된 요약문 형식에 따라 기 설정된 정보를 추출하여 요약문을 생성하는 단계를 더 포함하는 메모리 누수 검출 방법.
KR1020080038411A 2008-04-24 2008-04-24 메모리 누수 검출 장치 및 방법 KR100965426B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020080038411A KR100965426B1 (ko) 2008-04-24 2008-04-24 메모리 누수 검출 장치 및 방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020080038411A KR100965426B1 (ko) 2008-04-24 2008-04-24 메모리 누수 검출 장치 및 방법

Publications (2)

Publication Number Publication Date
KR20090112491A true KR20090112491A (ko) 2009-10-28
KR100965426B1 KR100965426B1 (ko) 2010-06-24

Family

ID=41553656

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020080038411A KR100965426B1 (ko) 2008-04-24 2008-04-24 메모리 누수 검출 장치 및 방법

Country Status (1)

Country Link
KR (1) KR100965426B1 (ko)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104991847A (zh) * 2015-07-03 2015-10-21 厦门美图移动科技有限公司 一种内存泄露自动化检测方法、装置及移动终端
CN105260313A (zh) * 2015-10-27 2016-01-20 上海斐讯数据通信技术有限公司 内存泄漏检查系统及方法
CN105373479A (zh) * 2015-12-14 2016-03-02 厦门美图移动科技有限公司 一种内存泄露的自动化测试方法、装置及移动终端
CN105740122A (zh) * 2016-01-26 2016-07-06 广东欧珀移动通信有限公司 一种手机内存泄漏的监测方法及监测系统
KR20160122618A (ko) * 2015-04-14 2016-10-24 한양대학교 산학협력단 비휘발성 메모리의 메모리 누수 복구 방법 및 장치

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR102057724B1 (ko) 2018-05-25 2019-12-19 고려대학교 산학협력단 메모리 해제 오류를 자동으로 수정하는 장치 및 방법

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5689707A (en) * 1995-12-04 1997-11-18 Ncr Corporation Method and apparatus for detecting memory leaks using expiration events and dependent pointers to indicate when a memory allocation should be de-allocated
JP2001331368A (ja) * 2000-05-19 2001-11-30 Oki Electric Ind Co Ltd メモリ解放漏れ判定方法
US20050081190A1 (en) * 2003-09-30 2005-04-14 International Business Machines Corporation Autonomic memory leak detection and remediation
JP4512402B2 (ja) * 2004-04-12 2010-07-28 株式会社日立製作所 メモリリークの原因箇所検出方法、及びその実行プログラム

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20160122618A (ko) * 2015-04-14 2016-10-24 한양대학교 산학협력단 비휘발성 메모리의 메모리 누수 복구 방법 및 장치
CN104991847A (zh) * 2015-07-03 2015-10-21 厦门美图移动科技有限公司 一种内存泄露自动化检测方法、装置及移动终端
CN104991847B (zh) * 2015-07-03 2018-11-23 厦门美图移动科技有限公司 一种内存泄露自动化检测方法、装置及移动终端
CN105260313A (zh) * 2015-10-27 2016-01-20 上海斐讯数据通信技术有限公司 内存泄漏检查系统及方法
CN105373479A (zh) * 2015-12-14 2016-03-02 厦门美图移动科技有限公司 一种内存泄露的自动化测试方法、装置及移动终端
CN105740122A (zh) * 2016-01-26 2016-07-06 广东欧珀移动通信有限公司 一种手机内存泄漏的监测方法及监测系统

Also Published As

Publication number Publication date
KR100965426B1 (ko) 2010-06-24

Similar Documents

Publication Publication Date Title
US8555259B2 (en) Verifying function performance based on predefined count ranges
US9529692B2 (en) Memory management tools
US8429620B2 (en) Memory leak diagnosis
US9110780B2 (en) Memory utilization analysis
US7313661B1 (en) Tool for identifying causes of memory leaks
EP3069241B1 (en) Application execution path tracing with configurable origin definition
US6634020B1 (en) Uninitialized memory watch
US7434206B2 (en) Identifying memory leaks in computer systems
US8566795B2 (en) Selectively obtaining call stack information based on criteria
KR100965426B1 (ko) 메모리 누수 검출 장치 및 방법
US9311217B2 (en) Analyzing computer programs to identify errors
US7853929B2 (en) Dynamically profiling consumption of CPU time in Java methods with respect to method line numbers while executing in a Java virtual machine
CN108153587B (zh) 一种针对大数据平台的慢任务原因检测方法
US20060085156A1 (en) Method and system for predicting memory leaks from unit testing
US20090271769A1 (en) Detecting irregular performing code within computer programs
Jung et al. Practical memory leak detector based on parameterized procedural summaries
US8060543B1 (en) Tracking software object use
US10241895B2 (en) Memory stack trace management tool
US7539833B2 (en) Locating wasted memory in software by identifying unused portions of memory blocks allocated to a program
US8176286B2 (en) Memory recycling in computer systems
CN111639018A (zh) 一种内存泄漏检测方法和装置
US10452534B2 (en) Asynchronous operation query
Moerman et al. Evaluating the performance of open source static analysis tools
WO2011039565A1 (en) Software probe minimization
JP2009217617A (ja) メモリリーク箇所の特定方法及び装置

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20130614

Year of fee payment: 6

FPAY Annual fee payment

Payment date: 20160613

Year of fee payment: 9