Skip to content

Commit

Permalink
[regression] added test case for pthread and abort
Browse files Browse the repository at this point in the history
Signed-off-by: Lucas Cordeiro <[email protected]>
  • Loading branch information
lucasccordeiro committed Aug 12, 2023
1 parent 63d4def commit 3a159aa
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 0 deletions.
104 changes: 104 additions & 0 deletions regression/esbmc-unix2/github_1270_1/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// This file is part of the SV-Benchmarks collection of verification tasks:
// https://gitlab.com/sosy-lab/benchmarking/sv-benchmarks
//
// SPDX-FileCopyrightText: 2021 F. Schuessele <[email protected]>
// SPDX-FileCopyrightText: 2021 D. Klumpp <[email protected]>
//
// SPDX-License-Identifier: LicenseRef-BSD-3-Clause-Attribution-Vandikas

typedef unsigned long int pthread_t;

union pthread_attr_t
{
char __size[36];
long int __align;
};
typedef union pthread_attr_t pthread_attr_t;

extern void __assert_fail(const char *__assertion, const char *__file,
unsigned int __line, const char *__function)
__attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__noreturn__));
void reach_error() { __assert_fail("0", "unroll-2.wvr.c", 21, __extension__ __PRETTY_FUNCTION__); }
extern int pthread_create (pthread_t *__restrict __newthread,
const pthread_attr_t *__restrict __attr,
void *(*__start_routine) (void *),
void *__restrict __arg) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 3)));
extern int pthread_join (pthread_t __th, void **__thread_return);

typedef unsigned int size_t;
extern void *malloc (size_t __size) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) ;

extern int __VERIFIER_nondet_int(void);
extern unsigned int __VERIFIER_nondet_uint(void);
extern void __VERIFIER_atomic_begin(void);
extern void __VERIFIER_atomic_end(void);

extern void abort(void);
void assume_abort_if_not(int cond) {
if(!cond) {abort();}
}

int *f;
int x1, x2, size;
unsigned int n;

int *create_fresh_int_array(int size);

void* thread1() {
unsigned int i = 0;
while (i < 2 * n) {
assume_abort_if_not(x1 >= 0 && x1 < size);
x1 = f[x1];
i++;
}
return 0;
}

void* thread2() {
unsigned int i = 0;
while (i < 2 * n) {
assume_abort_if_not(x2 >= 0 && x2 < size);
x2 = f[x2];
i++;
assume_abort_if_not(x2 >= 0 && x2 < size);
x2 = f[x2];
i++;
}
return 0;
}

int main() {
pthread_t t1, t2;

// initialize global variables
n = __VERIFIER_nondet_uint();
size = __VERIFIER_nondet_int();
assume_abort_if_not(size > 0);
f = create_fresh_int_array(size);

assume_abort_if_not(n < 4294967296 / 2);

// main method
pthread_create(&t1, 0, thread1, 0);
pthread_create(&t2, 0, thread2, 0);
pthread_join(t1, 0);
pthread_join(t2, 0);

assume_abort_if_not(x1 != x2);
reach_error();

return 0;
}

int *create_fresh_int_array(int size) {
assume_abort_if_not(size >= 0);
assume_abort_if_not(size <= (((size_t) 4294967295) / sizeof(int)));

int* arr = (int*)malloc(sizeof(int) * (size_t)size);
for (int i = 0; i < size; i++) {
arr[i] = __VERIFIER_nondet_int();
}
return arr;
}


4 changes: 4 additions & 0 deletions regression/esbmc-unix2/github_1270_1/test.desc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
CORE
main.c
--force-malloc-success --unwind 10 --no-unwinding-assertions --context-bound 2 --memory-leak-check --no-abnormal-memory-leak
^VERIFICATION SUCCESSFUL$

0 comments on commit 3a159aa

Please sign in to comment.