38 lines · c
1// RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s2// RUN: %clang_tsan -O1 -DACCESS_OFFSET=4 %s -o %t && %deflake %run %t | FileCheck %s3#include <stdlib.h>4 5#ifndef ACCESS_OFFSET6#define ACCESS_OFFSET 07#endif8 9__attribute__((noinline)) void foo(void *mem) {10 free(mem);11}12 13__attribute__((noinline)) void baz(void *mem) {14 free(mem);15}16 17__attribute__((noinline)) void bar(void *mem) {18 *(long*)((char*)mem + ACCESS_OFFSET) = 42;19}20 21int main() {22 void *mem = malloc(100);23 baz(mem);24 mem = malloc(100);25 foo(mem);26 bar(mem);27 return 0;28}29 30// CHECK: WARNING: ThreadSanitizer: heap-use-after-free31// CHECK: Write of size {{.*}} at {{.*}} by main thread:32// CHECK: #0 bar33// CHECK: #1 main34// CHECK: Previous write of size 8 at {{.*}} by main thread:35// CHECK: #0 free36// CHECK: #{{1|2}} foo37// CHECK: #{{2|3}} main38