mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
50 lines
2.2 KiB
Swift
50 lines
2.2 KiB
Swift
// REQUIRES: asan_runtime
|
|
// RUN: %target-swift-frontend -emit-ir -sanitize=address -sanitize-coverage=func %s | %FileCheck %s -check-prefix=SANCOV
|
|
// RUN: %target-swift-frontend -emit-ir -sanitize=address -sanitize-coverage=bb %s | %FileCheck %s -check-prefix=SANCOV
|
|
// RUN: %target-swift-frontend -emit-ir -sanitize=address -sanitize-coverage=edge %s | %FileCheck %s -check-prefix=SANCOV
|
|
// RUN: %target-swift-frontend -emit-ir -sanitize=fuzzer %s | %FileCheck %s -check-prefix=SANCOV
|
|
// RUN: %target-swift-frontend -emit-ir -sanitize=address -sanitize-coverage=edge,trace-cmp %s | %FileCheck %s -check-prefix=SANCOV -check-prefix=SANCOV_TRACE_CMP
|
|
// RUN: %target-swift-frontend -emit-ir -sanitize=address -sanitize-coverage=edge,trace-bb %s | %FileCheck %s -check-prefix=SANCOV -check-prefix=SANCOV_TRACE_BB
|
|
// RUN: %target-swift-frontend -emit-ir -sanitize=address -sanitize-coverage=edge,indirect-calls %s | %FileCheck %s -check-prefix=SANCOV -check-prefix=SANCOV_INDIRECT_CALLS
|
|
// RUN: %target-swift-frontend -emit-ir -sanitize=address -sanitize-coverage=edge,8bit-counters %s | %FileCheck %s -check-prefix=SANCOV -check-prefix=SANCOV_8BIT_COUNTERS
|
|
// RUN: %target-swift-frontend -emit-ir -sanitize=fuzzer %s | %FileCheck %s -check-prefix=SANCOV -check-prefix=SANCOV_TRACE_CMP
|
|
|
|
#if canImport(Darwin)
|
|
import Darwin
|
|
#elseif canImport(Glibc)
|
|
import Glibc
|
|
#elseif canImport(Android)
|
|
import Android
|
|
#elseif os(Windows)
|
|
import CRT
|
|
#elseif os(WASI)
|
|
import WASILibc
|
|
#else
|
|
#error("Unsupported platform")
|
|
#endif
|
|
|
|
// FIXME: We should have a reliable way of triggering an indirect call in the
|
|
// LLVM IR generated from this code.
|
|
func test() {
|
|
// Use random numbers so the compiler can't constant fold
|
|
#if canImport(Darwin)
|
|
let x = arc4random()
|
|
let y = arc4random()
|
|
#else
|
|
let x = rand()
|
|
let y = rand()
|
|
#endif
|
|
// Comparison is to trigger insertion of __sanitizer_cov_trace_cmp
|
|
let z = x == y
|
|
print("\(z)")
|
|
}
|
|
|
|
test()
|
|
|
|
// FIXME: We need a way to distinguish the different types of coverage instrumentation
|
|
// that isn't really fragile. For now just check there's at least one call to the function
|
|
// used to increment coverage count at a particular PC.
|
|
// SANCOV_TRACE_CMP: call void @__sanitizer_cov_trace_cmp
|
|
|
|
// SANCOV: call void @__sanitizer_cov
|