1*7c3d14c8STreehugger Robot // RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 2*7c3d14c8STreehugger Robot #include <stdlib.h> 3*7c3d14c8STreehugger Robot foo(int * mem)4*7c3d14c8STreehugger Robotvoid __attribute__((noinline)) foo(int *mem) { 5*7c3d14c8STreehugger Robot free(mem); 6*7c3d14c8STreehugger Robot } 7*7c3d14c8STreehugger Robot bar(int * mem)8*7c3d14c8STreehugger Robotvoid __attribute__((noinline)) bar(int *mem) { 9*7c3d14c8STreehugger Robot mem[0] = 42; 10*7c3d14c8STreehugger Robot } 11*7c3d14c8STreehugger Robot main()12*7c3d14c8STreehugger Robotint main() { 13*7c3d14c8STreehugger Robot int *mem = (int*)malloc(100); 14*7c3d14c8STreehugger Robot foo(mem); 15*7c3d14c8STreehugger Robot bar(mem); 16*7c3d14c8STreehugger Robot return 0; 17*7c3d14c8STreehugger Robot } 18*7c3d14c8STreehugger Robot 19*7c3d14c8STreehugger Robot // CHECK: WARNING: ThreadSanitizer: heap-use-after-free 20*7c3d14c8STreehugger Robot // CHECK: Write of size 4 at {{.*}} by main thread: 21*7c3d14c8STreehugger Robot // CHECK: #0 bar 22*7c3d14c8STreehugger Robot // CHECK: #1 main 23*7c3d14c8STreehugger Robot // CHECK: Previous write of size 8 at {{.*}} by main thread: 24*7c3d14c8STreehugger Robot // CHECK: #0 free 25*7c3d14c8STreehugger Robot // CHECK: #{{1|2}} foo 26*7c3d14c8STreehugger Robot // CHECK: #{{2|3}} main 27