1*09170626SVitaly Buka // RUN: %clangxx_asan -O0 %s --std=c++14 -o %t 23f7c3e84SVitaly Buka 3a59283a7SFangrui Song // RUN: not %run %t 10 0 2>&1 | FileCheck %s --check-prefixes=CHECK,T0 43f7c3e84SVitaly Buka // RUN: not %run %t 10000000 0 2>&1 | FileCheck %s --check-prefixes=CHECK,T0 53f7c3e84SVitaly Buka 6a59283a7SFangrui Song // RUN: not %run %t 10 1 2>&1 | FileCheck %s --check-prefixes=CHECK,T1 73f7c3e84SVitaly Buka // RUN: not %run %t 10000000 1 2>&1 | FileCheck %s --check-prefixes=CHECK,T1 83f7c3e84SVitaly Buka 913e04607SEvgenii Stepanov // REQUIRES: stable-runtime 1013e04607SEvgenii Stepanov 1113e04607SEvgenii Stepanov #include <sanitizer/asan_interface.h> 123f7c3e84SVitaly Buka #include <stdlib.h> 133f7c3e84SVitaly Buka #include <thread> 1413e04607SEvgenii Stepanov UPDATE(void * p)1513e04607SEvgenii Stepanovvoid UPDATE(void *p) { 1613e04607SEvgenii Stepanov __asan_update_allocation_context(p); 1713e04607SEvgenii Stepanov } 1813e04607SEvgenii Stepanov main(int argc,char * argv[])193f7c3e84SVitaly Bukaint main(int argc, char *argv[]) { 203f7c3e84SVitaly Buka char *x = (char *)malloc(atoi(argv[1]) * sizeof(char)); 213f7c3e84SVitaly Buka if (atoi(argv[2])) 223f7c3e84SVitaly Buka std::thread([&]() { UPDATE(x); }).join(); 233f7c3e84SVitaly Buka else 2413e04607SEvgenii Stepanov UPDATE(x); 2513e04607SEvgenii Stepanov free(x); 2613e04607SEvgenii Stepanov return x[5]; 2713e04607SEvgenii Stepanov // CHECK: {{.*ERROR: AddressSanitizer: heap-use-after-free on address}} 283f7c3e84SVitaly Buka // CHECK: READ of size 1 at {{.*}} thread T0 293f7c3e84SVitaly Buka // T0: allocated by thread T0 here 303f7c3e84SVitaly Buka // T1: allocated by thread T1 here 3113e04607SEvgenii Stepanov // CHECK: UPDATE 3213e04607SEvgenii Stepanov } 33