| // RUN: %clangxx_asan -O0 %s --std=c++14 -o %t |
| |
| // RUN: not %run %t 10 0 2>&1 | FileCheck %s --check-prefixes=CHECK,T0 |
| // RUN: not %run %t 10000000 0 2>&1 | FileCheck %s --check-prefixes=CHECK,T0 |
| |
| // RUN: not %run %t 10 1 2>&1 | FileCheck %s --check-prefixes=CHECK,T1 |
| // RUN: not %run %t 10000000 1 2>&1 | FileCheck %s --check-prefixes=CHECK,T1 |
| |
| // REQUIRES: stable-runtime |
| |
| #include <sanitizer/asan_interface.h> |
| #include <stdlib.h> |
| #include <thread> |
| |
| void UPDATE(void *p) { |
| __asan_update_allocation_context(p); |
| } |
| |
| int main(int argc, char *argv[]) { |
| char *x = (char *)malloc(atoi(argv[1]) * sizeof(char)); |
| if (atoi(argv[2])) |
| std::thread([&]() { UPDATE(x); }).join(); |
| else |
| UPDATE(x); |
| free(x); |
| return x[5]; |
| // CHECK: {{.*ERROR: AddressSanitizer: heap-use-after-free on address}} |
| // CHECK: READ of size 1 at {{.*}} thread T0 |
| // T0: allocated by thread T0 here |
| // T1: allocated by thread T1 here |
| // CHECK: UPDATE |
| } |