brintos

brintos / llvm-project-archived public Read only

0
0
Text · 863 B · ddba22c Raw
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