Clang 을 컴 파일 러 로 사용 합 니 다-AddressSanitizer

7960 단어 Clang
AddressSanitizer(미 완성)

  • 소개
  • 2.어떻게
  • 을 구축 합 니까?
  • 3.사용(사용)
  • 4.기호 표현 보고서(Symbolizing the Reports)
  • 추가 검사(Additional Checks)

  • 5.1 초기 화 순서 검사(초기 화 order checking)
  • 5.2 메모리 누 출 검출(Memory leak detection)
  • 6.문제 억제(문제 억제)
  • 6.1 외부 라 이브 러 리 의 보고 억제(Suppressing Reports in External Libraries)
  • 6.2 사용`has_feature(address_sanitizer)'조건 컴 파일
  • 6.3 사용`attribute__((no_sanitize("address"))'검사 비활성화
  • 6.4 재 컴 파일 코드 의 오류 억제(블랙리스트)
  • 6.5 메모리 누 출 억제


  • 제한
  • 8.지원 하 는 플랫폼
  • 9.현재 상태
  • 10.더 많은 정보


  • 본문 은 번역문 이 므 로 여 기 를 클릭 하여 원문 을 보십시오.
    1.소개AddressSanitizer 은 빠 른 메모리 오류 검출 기 이다.그것 은 컴 파일 러 검사 모듈 과 런 타임 라 이브 러 리 로 구성 되 어 있다.이 도 구 는 다음 유형의 bug 을 검사 할 수 있 습 니 다.
  • 힙,stack,globals 에 대한 크로스 오 버 방문
  • Use-after-free
  • Use-after-return(runtime flag ASAN_OPTIONS=detect_stack_use_after_return=1 )
  • Use-after-scope(clang flag -fsanitize-address-use-after-scope )
  • Double-free, invalid free
  • Memory leaks (experimental)
  • 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.더 많은 정보

    좋은 웹페이지 즐겨찾기