Skip to content

Commit

Permalink
Merge pull request #1172 from goblint/races_sjlj
Browse files Browse the repository at this point in the history
Add some `setjump/longjump` tests for race detection
  • Loading branch information
michael-schwarz authored Sep 18, 2023
2 parents 3666c92 + 18fe6d1 commit 851c6b3
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 0 deletions.
35 changes: 35 additions & 0 deletions tests/regression/68-longjmp/52-races.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// PARAM: --enable ana.int.interval
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <pthread.h>

jmp_buf env_buffer;
int global = 0;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

void *t_fun(void *arg) {
pthread_mutex_lock(&mutex1);
global = 3; // NORACE
pthread_mutex_unlock(&mutex1);
return NULL;
}

int bar() {
pthread_mutex_lock(&mutex1);
longjmp(env_buffer, 2);
pthread_mutex_unlock(&mutex1);
return 8;
}

int main() {
pthread_t id;
pthread_create(&id, NULL, t_fun, NULL);

if(!setjmp( env_buffer )) {
bar();
}

global = 5; // NORACE
pthread_mutex_unlock(&mutex1);
}
36 changes: 36 additions & 0 deletions tests/regression/68-longjmp/53-races-no.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// PARAM: --enable ana.int.interval
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <pthread.h>

jmp_buf env_buffer;
int global = 0;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

void *t_fun(void *arg) {
pthread_mutex_lock(&mutex1);
global = 3; // NORACE
pthread_mutex_unlock(&mutex1);
return NULL;
}

int bar() {
pthread_mutex_lock(&mutex1);
if(global ==3) {
longjmp(env_buffer, 2);
}
return 8;
}

int main() {
pthread_t id;
pthread_create(&id, NULL, t_fun, NULL);

if(!setjmp( env_buffer )) {
bar();
}

global = 5; // NORACE
pthread_mutex_unlock(&mutex1);
}
50 changes: 50 additions & 0 deletions tests/regression/68-longjmp/54-races-actually.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// PARAM: --enable ana.int.interval
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <pthread.h>

jmp_buf env_buffer;
int global = 0;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

void *t_fun(void *arg) {
pthread_mutex_lock(&mutex1);
global = 3; // RACE
pthread_mutex_unlock(&mutex1);
return NULL;
}

int bar() {
pthread_mutex_lock(&mutex1);
if(global == 3) {
longjmp(env_buffer, 2);
} else {
longjmp(env_buffer, 4);
}
return 8;
}

int main() {
pthread_t id;
pthread_create(&id, NULL, t_fun, NULL);
int n = 0;

switch(setjmp( env_buffer )) {
case 0:
bar();
break;
case 2:
n=1;
pthread_mutex_unlock(&mutex1);
break;
default:
break;
}

global = 5; //RACE

if(n == 0) {
pthread_mutex_unlock(&mutex1);
}
}
50 changes: 50 additions & 0 deletions tests/regression/68-longjmp/55-races-no-return.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// PARAM: --enable ana.int.interval
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <pthread.h>

jmp_buf env_buffer;
int global = 0;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

void *t_fun(void *arg) {
pthread_mutex_lock(&mutex1);
global = 3; //NORACE
pthread_mutex_unlock(&mutex1);
return NULL;
}

int bar() {
pthread_mutex_lock(&mutex1);
if(global == 7) {
longjmp(env_buffer, 2);
} else {
longjmp(env_buffer, 4);
}
return 8;
}

int main() {
pthread_t id;
pthread_create(&id, NULL, t_fun, NULL);
int n = 0;

switch(setjmp( env_buffer )) {
case 0:
bar();
break;
case 2:
n=1;
pthread_mutex_unlock(&mutex1);
break;
default:
break;
}

global = 5; //NORACE

if(n == 0) {
pthread_mutex_unlock(&mutex1);
}
}

0 comments on commit 851c6b3

Please sign in to comment.