// RUN: %clangxx -fsanitize=realtime %s -o %t // RUN: not %run %t 2>&1 | FileCheck %s // RUN: %clangxx %s -fsanitize=realtime -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-ENABLED-IR // RUN: %clangxx %s -o - -S -emit-llvm | FileCheck %s --check-prefix=CHECK-DISABLED-IR // UNSUPPORTED: ios #include #include #include "sanitizer/rtsan_interface.h" void violation() [[clang::nonblocking]] { void *ptr; { __rtsan::ScopedDisabler disabler{}; ptr = malloc(2); fprintf(stderr, "Allocated pointer %p in disabled context\n", ptr); } // ensure nested disablers don't interfere with one another { void *ptr2; __rtsan::ScopedDisabler disabler{}; { __rtsan::ScopedDisabler disabler2{}; ptr2 = malloc(2); fprintf(stderr, "Allocated second pointer %p in disabled context\n", ptr2); } free(ptr2); fprintf(stderr, "Free'd second pointer in disabled context\n"); } free(ptr); } int main() { violation(); return 0; // CHECK: Allocated pointer {{.*}} in disabled context // CHECK: Allocated second pointer {{.*}} in disabled context // CHECK: Free'd second pointer in disabled context // CHECK: ==ERROR: RealtimeSanitizer: unsafe-library-call // CHECK-NOT: {{.*malloc*}} // CHECK-NEXT: {{.*free.*}} } // CHECK-ENABLED-IR: {{.*@__rtsan_disable.*}} // CHECK-ENABLED-IR: {{.*@__rtsan_enable.*}} // CHECK-DISABLED-IR-NOT: {{.*__rtsan_disable.*}} // CHECK-DISABLED-IR-NOT: {{.*__rtsan_enable.*}}