Clang 을 컴 파일 러 로 사용 합 니 다-AddressSanitizer
7960 단어 Clang
소개
5.1 초기 화 순서 검사(초기 화 order checking)
제한
본문 은 번역문 이 므 로 여 기 를 클릭 하여 원문 을 보십시오.
1.소개
AddressSanitizer
은 빠 른 메모리 오류 검출 기 이다.그것 은 컴 파일 러 검사 모듈 과 런 타임 라 이브 러 리 로 구성 되 어 있다.이 도 구 는 다음 유형의 bug
을 검사 할 수 있 습 니 다.ASAN_OPTIONS=detect_stack_use_after_return=1
) -fsanitize-address-use-after-scope
) AddressSanitizer
이 도입 한 전형 적 인 감속 은 2 배 이다.2.어떻게 구축 합 니까?
CMake 를 사용 하여 LLVM/lang 을 구축 합 니 다.
3.사용(사용)
-fsanitize=address
flag 를 사용 하여 프로그램 을 컴 파일 하고 연결 하기 만 하면 됩 니 다.AddressSanitizer
이 실 행 될 때 라 이브 러 리 는 최종 실행 가능 한 파일 로 연결 되 어야 하기 때문에 마지막 링크 단계 에서 clang
(ld
이 아 닌)을 사용 하도록 확보 합 니 다.공유 라 이브 러 리 를 연결 할 때 AddressSanitizer
이 실 행 될 때 연결 되 지 않 았 기 때문에 -Wl
,-z
,defs
은 링크 오류 가 발생 할 수 있 습 니 다(AddressSanitizer
과 함께 사용 하지 마 십시오).합 리 적 인 성능 을 얻 으 려 면 -O1
이상 을 추가 하 십시오.오류 메시지 에서 더 좋 은 스 택 추적 을 얻 으 려 면 -fno-omit-frame-pointer
을 추가 하 십시오.완벽 한 스 택 추적 을 얻 으 려 면 내 연(-O1
만 사용)과 꼬리 호출 제거(-fno-optimize-sibling-call
)를 사용 하지 않 아야 할 수도 있 습 니 다.% cat example_UseAfterFree.cc
int main(int argc, char **argv) {
int *array = new int[100];
delete [] array;
return array[argc]; // BOOM
}
# Compile and link
% clang++ -O1 -g -fsanitize=address -fno-omit-frame-pointer example_UseAfterFree.cc
혹시
# Compile
% clang++ -O1 -g -fsanitize=address -fno-omit-frame-pointer -c example_UseAfterFree.cc
# Link
% clang++ -g -fsanitize=address example_UseAfterFree.o
bug 가 감지 되면 프로그램 은 stderr 에 오류 메 시 지 를 인쇄 하고 0 이 아 닌 종료 코드 로 종료 합 니 다.
AddressSanitizer
오류 가 처음 감지 되 었 을 때 종료 합 니 다.이것 은 그것 의 디자인 이다.AddressSanitizer
에서 더 빠 르 고 더 작은 코드 를 생 성 할 수 있다(둘 다 약 5%의 코드 를 생 성 할 수 있다).AddressSanitizer
에는 허위 경보 가 발생 하지 않 습 니 다.메모리 손상 이 발생 하면 프로그램 이 일치 하지 않 는 상태 에 있 기 때문에 혼 란 스 러 운 결과 와 잠재 적 인 오도 후속 보 고 를 초래 할 수 있 습 니 다.프로 세 스 가 샌 드 박스 화 되 어
OS X 10.10
또는 더 빠 른 버 전에 서 실행 된다 면 DYLD_INSERT_LIBRARIES
환경 변 수 를 설정 하고 ASan
라 이브 러 리 를 가리 키 며 ASan
라 이브 러 리 를 컴 파일 러 로 포장 하여 실행 가능 한 파일 을 구축 해 야 합 니 다.(asan
이름 의 동적 라 이브 러 리 를 검색 하여 이 라 이브 러 리 를 찾 을 수 있 습 니 다.)환경 변 수 를 설정 하지 않 으 면 프로 세 스 가 다시 실행 하려 고 시도 합 니 다.실행 가능 한 파일 을 다른 기계 로 이동 할 때 ASan
라 이브 러 리 를 복사 해 야 한 다 는 것 도 기억 해 야 한다.4.기호 로 보고서 표현(Symbolizing the Reports)
AddressSanitizer
을 symbolize 로 출력 하려 면 ASAN_SYMBOLIZER_PATH
환경 변 수 를 설정 하여 llvm-symbolizer
바 이 너 리 파일 을 가리 키 거나 llvm-symbolizer
이 $PATH
에 있 는 지 확인 해 야 합 니 다.% ASAN_SYMBOLIZER_PATH=/usr/local/bin/llvm-symbolizer ./a.out
==9442== ERROR: AddressSanitizer heap-use-after-free on address 0x7f7ddab8c084 at pc 0x403c8c bp 0x7fff87fb82d0 sp 0x7fff87fb82c8
READ of size 4 at 0x7f7ddab8c084 thread T0
#0 0x403c8c in main example_UseAfterFree.cc:4
#1 0x7f7ddabcac4d in __libc_start_main ??:0
0x7f7ddab8c084 is located 4 bytes inside of 400-byte region [0x7f7ddab8c080,0x7f7ddab8c210)
freed by thread T0 here:
#0 0x404704 in operator delete[](void*) ??:0
#1 0x403c53 in main example_UseAfterFree.cc:4
#2 0x7f7ddabcac4d in __libc_start_main ??:0
previously allocated by thread T0 here:
#0 0x404544 in operator new[](unsigned long) ??:0
#1 0x403c43 in main example_UseAfterFree.cc:2
#2 0x7f7ddabcac4d in __libc_start_main ??:0
==9442== ABORTING
만약 이것 이 당신 에 게 효과 가 없다 면(예 를 들 어,당신 의 과정 은 샌 드 박스 입 니 다),하나의 단독 스 크 립 트 오프라인 으로 symbolize 결 과 를 사용 할 수 있 습 니 다.(
ASAN_OPTIONS=symbolize=0
설정 을 통 해 온라인 symbolization 을 강제로 사용 하지 않 을 수 있 습 니 다.)% ASAN_OPTIONS=symbolize=0 ./a.out 2> log
% projects/compiler-rt/lib/asan/scripts/asan_symbolize.py / < log | c++filt
==9442== ERROR: AddressSanitizer heap-use-after-free on address 0x7f7ddab8c084 at pc 0x403c8c bp 0x7fff87fb82d0 sp 0x7fff87fb82c8
READ of size 4 at 0x7f7ddab8c084 thread T0
#0 0x403c8c in main example_UseAfterFree.cc:4
#1 0x7f7ddabcac4d in __libc_start_main ??:0
...
macOS 에 서 는
dsymutil
보고서 에 파일 AddressSanitizer
정 보 를 포함 할 수 있 도록 바 이 너 리 파일 에서 file:line
을 실행 해 야 할 수도 있 습 니 다.5.추가 검사(Additional Checks)
5.1 초기 화 순서 검사(초기 화 순서 검사)
한 번역 단원 에서 정 의 된 전역 변수의 초기 화 는 다른 번역 단원 에서 정 의 된 전역 변 수 를 사용 할 때
AddressSanitizer
은 동적 초기 화 순서 문 제 를 선택적으로 검사 할 수 있다.실행 할 때 이 검 사 를 사용 하려 면 환경 변 수 를 ASAN_OPTIONS=check_initialization_order=1
으로 설정 해 야 합 니 다.macOS 에 서 는 이 옵션 을 지원 하지 않 습 니 다.5.2 메모리 누 출 검사(메모리 누 출 감지)
AddressSanitizer
의 leak detector 에 대한 더 많은 정 보 는 LeakSanitizer 를 참조 하 시기 바 랍 니 다.기본 적 인 상황 에서 Linux 에서 누설 검 사 를 열 었 습 니 다.ASAN_OPTIONS=detect_leaks=1
을 사용 하여 macOS 에서 사용 할 수 있 습 니 다.그러나 다른 플랫폼 에서 지 지 를 받 지 못 했다.6.문제 억제(문제 억제)
6.1 외부 라 이브 러 리 의 보고 억제(Suppressing Reports in External Libraries)
6.2
__has_feature(address_sanitizer)
조건 컴 파일 사용6.3
__attribute__((no_sanitize("address")))
사용 하지 않 기6.4 재 컴 파일 코드 의 오류 억제(블랙리스트)
6.5 메모리 누 출 억제
7.제한
8.지원 하 는 플랫폼
9.현재 상태
10.더 많은 정보