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