brintos

brintos / llvm-project-archived public Read only

0
0
Text · 942 B · fd31c9c Raw
53 lines · cpp
1// RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t 2>&1 | FileCheck %s2 3#include <pthread.h>4#include <stdio.h>5#include <stdlib.h>6#include <setjmp.h>7#include <string.h>8 9void bar(jmp_buf env) {10  volatile int x = 42;11  jmp_buf env2;12  memcpy(env2, env, sizeof(jmp_buf));13  longjmp(env2, 42);14  x++;15}16 17void foo(jmp_buf env) {18  volatile int x = 42;19  bar(env);20  x++;21}22 23__attribute__((noinline)) void badguy() {24  pthread_mutex_t mtx;25  pthread_mutex_init(&mtx, 0);26  pthread_mutex_lock(&mtx);27  pthread_mutex_destroy(&mtx);28}29 30__attribute__((noinline)) void mymain() {31  jmp_buf env;32  if (setjmp(env) == 42) {33    badguy();34    return;35  }36  foo(env);37  fprintf(stderr, "FAILED\n");38}39 40int main() {41  volatile int x = 42;42  mymain();43  return x;44}45 46// CHECK-NOT: FAILED47// CHECK: WARNING: ThreadSanitizer: destroy of a locked mutex48// CHECK:   #0 pthread_mutex_destroy49// CHECK:   #1 badguy50// CHECK:   #2 mymain51// CHECK:   #3 main52 53