마이락(Mairac)의 분석 방법(1/2) - Programming Research Laboratory

Download Report

Transcript 마이락(Mairac)의 분석 방법(1/2) - Programming Research Laboratory

C 프로그램의 메모리 접근 검증을
위한 두 가지 분석기 개발
(memory leak, null dereference)
프로젝트 중간 보고
Programming Research Lab.
Seoul National University
목차




현재 상황
분석 방법/한계
테스트 코드와 삼성 과제에 적용한 결과
후반기계획
Programming Research Lab./ Seoul National University
현재 상황

기능 구현 정도



메모리 누수(memory leak): 80% 구현됨, 정확도 향상
여지가 많음
할당 안 된 메모리 참조오류(null dereference): 디자
인 완료
오류 검출 능력

테스트 코드와 삼성 과제(AnyPlay+)에 대한 Prevent와
비교
Programming Research Lab./ Seoul National University
마이락(Mairac)의 분석 방법(1/2)

요약해석(abstract interpretation): 프로그램실
행의 안전한 요약



초점 = 동적으로 할당, 해제되는 요약된 주소
요약된 주소(pointer)가 실행중에 정의되고 사용되는
모든 가능한 상황을 분석
Mairac = Airac + malloc/free-analysis
Programming Research Lab./ Seoul National University
마이락(Mairac)의 분석 방법(2/2)

option 1: free-before-end


할당된 주소가 프로그램 종료 전에 해제되는 지 검증
option 2: free-before-return


함수 실행중에 할당된 메모리가 함수종료 전에 해제되
는 지 검증
함수외부로 유출되는 지도 검증
Programming Research Lab./ Seoul National University
마이락(Mairac)의 한계

하나의 요약된 주소/“malloc(size)”

no information about the structure of heap data
...

의미하는 모든 요약된 주소/“free(ptr)”


our design choice
soundness violation in principle yet rare in practice
Programming Research Lab./ Seoul National University
적용 – 마이락(Mairac) 테스트 코드
9 files
360 LOC
* Pointer
Arithmetic
Mairac
3
True
False
4
2
Prevent
Programming Research Lab./ Seoul National University
* No heap data
structure analysis
함수간의 포인터 정보(Interprocedural
Pointer aliasing)
void pointer(char **p, char* s){ *p = s; }
int ResourceLeak_TC03 (int arg1)
{
char str[10] ="STRING";
char *p1, *p2;
p1 = (char *)malloc(sizeof(char)*10);
if( p1 == NULL) return 1;
strcat(p1,str);
pointer(&p2,p1);
free(p2);
// both Mairac and Prevent conclude OK
return 0;
}
Programming Research Lab./ Seoul National University
포인터 연산(Pointer Arithmetic)
int pointer_arithmetic(int arg1)
{
char *buf1, *buf2, *p;
int i;
buf1 = malloc(10);
p = buf2 = malloc(10);
for(i=0;i<10;i++){
buf1++; buf2++;
}
free(buf1);
// Prevent doesn’t alarm
free(p);
}
Programming Research Lab./ Seoul National University
경로 고려(Path-Sensitivity)
int unclear_condition(int cond)
{
char *buf1, *buf2;
int i;
if (cond) buf1 = alloc(10);
// cond != 0
else
// cond == 0
buf2 = alloc(10);
cond = cond + 10;
if (cond) free(buf1);
else free(buf2);
}
Prevent는 알람을 내지 않는 쪽을 선택
우리는 경로 고려 분석을 통해 정확성 향상을 선택
Programming Research Lab./ Seoul National University
자료구조 분석
(Heap Data Structure Analysis)
typedef struct _list {
free_list(list hd) {
struct _list *next;
list p;
} List,*list;
while (hd != NULL) {
list make_list(int n) {
p = hd->next;
int i;
free(hd);
list hd = (list)malloc(sizeof(List )), p = hd;
hd = p;
for (i=0; i<n; i++) {
}
p->next = (list)malloc(sizeof(List ));
}
p = p->next;
int main() {
}
list l = make_list(10);
p->next = NULL;
free_list(l);
return hd;
}
Programming Research Lab./ Seoul National University
}
적용 – 실제 과제(AnyPlay+)
102 files
72,293 LOC
Pentium 2.8 3GB
Mairac
•중복 알람
Prevent
•라이브러리 함수
about 1hr
True
False
Programming Research Lab./ Seoul National University
72
20
23
22
337
8
목표: false alarm
ratio · 50%
후반기 계획

오류 검출 능력 향상

Prevent만 잡는 버그도 모두 포함



허위 경보(false alarm) 최소화
리포트 방법 개선


strdup, asprintf, fopen, fclose ...
버그 판단에 도움을 주는 방법 구현
할당 안 된 메모리 참조오류(null dereference)
분석 추가
감사합니다
Programming Research Lab./ Seoul National University