Skip to content

Commit 25e5820

Browse files
committed
Java concurrency regression tests
1 parent bc539b5 commit 25e5820

File tree

6 files changed

+109
-0
lines changed

6 files changed

+109
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
add_test_pl_tests(
2+
"$<TARGET_FILE:jbmc>"
3+
)
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
default: tests.log
2+
3+
test:
4+
@../test.pl -p -c ../../../src/jbmc/jbmc
5+
6+
tests.log: ../test.pl
7+
@../test.pl -p -c ../../../src/jbmc/jbmc
8+
9+
show:
10+
@for dir in *; do \
11+
if [ -d "$$dir" ]; then \
12+
vim -o "$$dir/*.java" "$$dir/*.out"; \
13+
fi; \
14+
done;
15+
16+
clean:
17+
find -name '*.out' -execdir $(RM) '{}' \;
18+
find -name '*.gb' -execdir $(RM) '{}' \;
19+
$(RM) tests.log
20+
21+
%.class: %.java ../../src/org.cprover.jar
22+
javac -g -cp ../../src/org.cprover.jar:. $<
23+
24+
nondet_java_files := $(shell find . -name "Nondet*.java")
25+
nondet_class_files := $(patsubst %.java, %.class, $(nondet_java_files))
26+
27+
.PHONY: nondet-class-files
28+
nondet-class-files: $(nondet_class_files)
29+
30+
.PHONY: clean-nondet-class-files
31+
clean-nondet-class-files:
32+
-rm $(nondet_class_files)
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import java.lang.Thread;
2+
import org.cprover.CProver;
3+
4+
public class A
5+
{
6+
static int x = 0;
7+
8+
// verification success
9+
public void me()
10+
{
11+
x = 5;
12+
CProver.startThread(333);
13+
x = 10;
14+
CProver.endThread(333);
15+
assert(x == 5 || x == 10);
16+
}
17+
18+
// verification failed
19+
public void me2()
20+
{
21+
x = 5;
22+
CProver.startThread(333);
23+
x = 10;
24+
CProver.endThread(333);
25+
assert(x == 10);
26+
}
27+
28+
// Known-bug, thread id mismatch, this should be detected by the conversation
29+
// process. It is currently not and thus will result in an assertion violation
30+
// during symbolic execution.
31+
public void me3()
32+
{
33+
x = 5;
34+
CProver.startThread(22333);
35+
x = 10;
36+
CProver.endThread(333);
37+
assert(x == 10);
38+
}
39+
40+
// Known-bug, see: https://github.com/diffblue/cbmc/issues/1630
41+
public void me4()
42+
{
43+
int x2 = 10;
44+
CProver.startThread(22333);
45+
x = x2;
46+
assert(x == 10);
47+
CProver.endThread(333);
48+
}
49+
50+
// Known-bug, symex cannot handle nested thread-blocks
51+
public void me5()
52+
{
53+
CProver.startThread(333);
54+
x = 5;
55+
CProver.startThread(222);
56+
x = 8;
57+
CProver.endThread(222);
58+
CProver.endThread(333);
59+
assert(x == 5 || x == 0 || x == 8);
60+
}
61+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
A.class
3+
--function "A.me:()V" --lazy-methods --java-threading
4+
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
^VERIFICATION SUCCESSFUL
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
CORE
2+
A.class
3+
--function "A.me2:()V" --lazy-methods --java-threading
4+
5+
^SIGNAL=0$
6+
^VERIFICATION FAILED

0 commit comments

Comments
 (0)