Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

새니타이저 지원

rustc 컴파일러는 다음 새니타이저를 지원합니다:

  • AddressSanitizer는 더 빠른 메모리 오류 탐지기입니다. 힙, 스택, 전역 변수에 대한 범위 밖 접근, 해제 후 사용(use after free), 반환 후 사용(use after return), 이중 해제, 잘못된 해제, 메모리 누수를 탐지할 수 있습니다.
  • ControlFlowIntegrity는 LLVM 제어 흐름 무결성(CFI)으로, 순방향(forward-edge) 제어 흐름 보호를 제공합니다.
  • Hardware-assisted AddressSanitizer는 AddressSanitizer와 비슷하지만 부분적인 하드웨어 지원을 기반으로 하는 도구입니다.
  • KernelControlFlowIntegrity는 LLVM 커널 제어 흐름 무결성(KCFI)으로, 운영 체제 커널을 위한 순방향(forward-edge) 제어 흐름 보호를 제공합니다.
  • LeakSanitizer는 런타임 메모리 누수 탐지기입니다.
  • MemorySanitizer는 초기화되지 않은 읽기를 탐지하는 도구입니다.
  • ThreadSanitizer는 빠른 데이터 경쟁 탐지기입니다.

새니타이저는 어떻게 사용합니까?

새니타이저를 활성화하려면 -Z sanitizer=... 옵션을 붙여 컴파일하십시오. 이때 값은 address, cfi, hwaddress, kcfi, leak, memory, thread 중 하나입니다. 새니타이저 사용법에 대한 자세한 내용은 The Unstable Book의 sanitizer 플래그 항목을 참고하십시오.

rustc에서 새니타이저는 어떻게 구현되어 있습니까?

새니타이저 구현은 (CFI를 제외하면) 거의 전적으로 LLVM에 의존합니다. rustc는 LLVM의 컴파일 타임 계측 패스와 런타임 라이브러리를 통합하는 지점입니다. 구현에서 가장 중요한 측면을 짚어 보면 다음과 같습니다:

  • 새니타이저 런타임 라이브러리는 compiler-rt(컴파일러 런타임) 프로젝트의 일부이며, bootstrap.toml에서 활성화하면 지원되는 타깃에서 빌드됩니다:

    build.sanitizers = true
    

    런타임은 타깃 libdir에 배치됩니다.

  • LLVM 코드 생성 중에 계측 대상 함수에는 적절한 LLVM 속성인 SanitizeAddress, SanitizeHWAddress, SanitizeMemory, SanitizeThread 중 하나가 표시됩니다. 기본적으로 모든 함수가 계측되지만, 이 동작은 #[sanitize(xyz = "on|off|<other>")]로 변경할 수 있습니다.

  • 계측 수행 여부는 함수 단위로만 결정할 수 있습니다. 이 결정이 함수마다 다른 경우에는 MIR 수준과 LLVM 수준 모두에서 인라이닝을 막아야 할 수도 있습니다.

  • rustc가 생성한 LLVM IR은 새니타이저마다 다른 전용 LLVM 패스로 계측됩니다. 계측 패스는 최적화 패스 이후에 실행됩니다.

  • 실행 파일을 만들 때는 새니타이저별 런타임 라이브러리가 링크됩니다. 라이브러리는 타깃 libdir에서 검색합니다. 먼저 재정의된 시스템 루트를 기준으로 검색하고, 그다음 기본 시스템 루트를 기준으로 검색합니다. 기본 시스템 루트로 대체 검색하므로, cargo -Z build-std나 xargo로 구성한 sysroot 재정의를 사용할 때에도 새니타이저 런타임을 계속 사용할 수 있습니다.

새니타이저 테스트

새니타이저는 tests/codegen-llvm/sanitize*.rs의 코드 생성 테스트와 tests/ui/sanitizer/ 디렉터리의 종단 간 기능 테스트로 검증합니다.

새니타이저 기능을 테스트하려면 새니타이저 런타임(bootstrap.toml에서 build.sanitizer = true일 때 빌드됨)과 해당 새니타이저를 지원하는 타깃이 필요합니다. 주어진 타깃에서 새니타이저가 지원되지 않으면 새니타이저 테스트는 무시됩니다. 이 동작은 compiletest의 needs-sanitizer-* 지시문으로 제어됩니다.

새 타깃에서 새니타이저 활성화하기

LLVM이 이미 지원하는 새 타깃에서 새니타이저를 활성화하려면 다음과 같이 하십시오.

  1. 타깃 정의의 supported_sanitizers 목록에 해당 새니타이저를 포함하십시오. 이제 rustc --target .. -Zsanitizer=..가 해당 새니타이저를 지원되는 것으로 인식해야 합니다.
  2. 타깃용 런타임을 빌드하여 libdir에 포함하십시오.
  3. 여러분의 타깃이 이제 해당 새니타이저를 지원한다는 것을 compiletest에 알려 주십시오. 이제 needs-sanitizer-*로 표시된 테스트가 해당 타깃에서 실행되어야 합니다.
  4. 확인하려면 ./x test --force-rerun tests/ui/sanitize/ 테스트를 실행하십시오.
  5. CI 구성에서 –enable-sanitizers를 설정하여 릴리스 과정의 일부로 새니타이저 런타임을 빌드하고 배포하십시오.

추가 정보