Skip to content

Commit 4d88965

Browse files
committed
introduce 'fatal assertions'
This introduces a variant of ASSERT instructions that are fatal when they are refuted. Execution paths through fatal assertions that are refuted are undefined. Assertions that (otherwise) pass and that are reachable from a refuted fatal assertion are now reported as UNKNOWN. The motivating use-case for fatal assertions is undefined behavior in languages such as C/C++ or Rust.
1 parent e8ff03a commit 4d88965

File tree

19 files changed

+331
-33
lines changed

19 files changed

+331
-33
lines changed

jbmc/regression/jbmc-strings/StringFormatString/test-string1-length.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE
1+
KNOWNBUG
22
Test
33
--function Test.string1Length --cp `../../../../scripts/format_classpath.sh . ../../../lib/java-models-library/target/core-models.jar ../../../lib/java-models-library/target/cprover-api.jar`
44
^EXIT=10$

jbmc/regression/jbmc-strings/string-non-empty-option/test_non_empty.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE
1+
KNOWNBUG
22
Test
33
--function Test.checkMinLength --string-non-empty --max-nondet-string-length 2147483647
44
^EXIT=10$

regression/cbmc-incr-smt2/bitvector-flag-tests/div_by_zero.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ CORE
22
div_by_zero.c
33
--div-by-zero-check --trace
44
\[main\.division-by-zero\.1\] line \d division by zero in x / y: FAILURE
5-
\[main\.division-by-zero\.2\] line \d+ division by zero in x / z: SUCCESS
5+
\[main\.division-by-zero\.2\] line \d+ division by zero in x / z: UNKNOWN
66
y=0
77
^VERIFICATION FAILED$
88
^EXIT=10$

regression/cbmc/Division3/main.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
_Bool nondet_bool();
2+
3+
void main()
4+
{
5+
__CPROVER_assert(0, "non-fatal assertion");
6+
7+
if(nondet_bool())
8+
{
9+
int divisor = nondet_bool() ? 2 : 0;
10+
11+
// possible division by zero
12+
int result = 10 / divisor;
13+
14+
__CPROVER_assert(divisor == 2 || divisor == 0, "divisor value");
15+
}
16+
else
17+
__CPROVER_assert(0, "independent assertion");
18+
}

regression/cbmc/Division3/test.desc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
CORE
2+
main.c
3+
4+
^EXIT=10$
5+
^SIGNAL=0$
6+
^\[main\.assertion\.1\] line 5 non-fatal assertion: FAILURE$
7+
^\[main\.division-by-zero\.1\] line 12 division by zero in 10 / divisor: FAILURE$
8+
^\[main\.assertion\.2\] line 14 divisor value: UNKNOWN$
9+
^\[main\.assertion\.3\] line 17 independent assertion: FAILURE$
10+
^\*\* 3 of 4 failed
11+
^VERIFICATION FAILED$
12+
--
13+
^warning: ignoring

regression/cbmc/pragma_cprover_enable_all/test.desc

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,22 @@ main.c
88
^\[main\.float-division-by-zero\.\d+\] line 87 floating-point division by zero in x / den: FAILURE
99
^\[main\.overflow\.\d+\] line 87 arithmetic overflow on floating-point division in x / den: FAILURE
1010
^\[main\.division-by-zero\.\d+\] line 88 division by zero in 10 / 0: FAILURE$
11-
^\[main\.enum-range-check\.\d+\] line 89 enum range check in \(ABC\)10: FAILURE
12-
^\[main\.overflow\.\d+\] line 90 arithmetic overflow on signed (to unsigned )?type conversion in \(char\)\(\(signed int\)i \+ 1\): FAILURE
13-
^\[main\.overflow\.\d+\] line 91 arithmetic overflow on signed \+ in k \+ 1: FAILURE
11+
^\[main\.enum-range-check\.\d+\] line 89 enum range check in \(ABC\)10: UNKNOWN$
12+
^\[main\.overflow\.\d+\] line 90 arithmetic overflow on signed (to unsigned )?type conversion in \(char\)\(\(signed int\)i \+ 1\): UNKNOWN$
13+
^\[main\.overflow\.\d+\] line 91 arithmetic overflow on signed \+ in k \+ 1: UNKNOWN$
1414
^VERIFICATION FAILED$
1515
^EXIT=10$
1616
^SIGNAL=0$
1717
--
18-
^\[main\.pointer_primitives\.\d+\] line 41 pointer invalid in R_OK\(q, \(unsigned (long (long )?)?int\)1\): FAILURE$
19-
^\[main\.pointer_primitives\.\d+\] line 41 pointer outside object bounds in R_OK\(q, \(unsigned (long (long )?)?int\)1\): FAILURE$
20-
^\[main\.pointer_arithmetic\.\d+\] line 42 pointer arithmetic: pointer outside object bounds in p \+ .*2000000000000(l|ll): FAILURE
21-
^\[main\.NaN\.\d+\] line 48 NaN on / in x / den: FAILURE
22-
^\[main\.float-division-by-zero\.\d+\] line 49 floating-point division by zero in x / den: FAILURE
23-
^\[main\.overflow\.\d+\] line 48 arithmetic overflow on floating-point division in x / den: FAILURE
24-
^\[main\.division-by-zero\.\d+\] line 48 division by zero in 10 / 0: FAILURE$
25-
^\[main\.enum-range-check\.\d+\] line 49 enum range check in \(ABC\)10: FAILURE
26-
^\[main\.overflow\.\d+\] line 50 arithmetic overflow on signed type conversion in \(char\)\(signed int\)i \+ 1\): FAILURE
27-
^\[main\.overflow\.\d+\] line 51 arithmetic overflow on signed \+ in k \+ 1: FAILURE
18+
^\[main\.pointer_primitives\.\d+\] line 41 pointer invalid in R_OK\(q, \(unsigned (long (long )?)?int\)1\):
19+
^\[main\.pointer_primitives\.\d+\] line 41 pointer outside object bounds in R_OK\(q, \(unsigned (long (long )?)?int\)1\):
20+
^\[main\.pointer_arithmetic\.\d+\] line 42 pointer arithmetic: pointer outside object bounds in p \+ .*2000000000000(l|ll):
21+
^\[main\.NaN\.\d+\] line 48 NaN on / in x / den:
22+
^\[main\.float-division-by-zero\.\d+\] line 49 floating-point division by zero in x / den:
23+
^\[main\.overflow\.\d+\] line 48 arithmetic overflow on floating-point division in x / den:
24+
^\[main\.division-by-zero\.\d+\] line 48 division by zero in 10 / 0:
25+
^\[main\.enum-range-check\.\d+\] line 49 enum range check in \(ABC\)10:
26+
^\[main\.overflow\.\d+\] line 50 arithmetic overflow on signed type conversion in \(char\)\(signed int\)i \+ 1\):
27+
^\[main\.overflow\.\d+\] line 51 arithmetic overflow on signed \+ in k \+ 1:
2828
--
2929
This test uses all possible named-checks to maximize coverage.

regression/contracts-dfcc/assigns-slice-targets/test-replace.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE
1+
KNOWNBUG
22
main-replace.c
33
--dfcc main --replace-call-with-contract foo
44
^\[main.assertion.\d+\].*assertion s.a == 0: SUCCESS$

regression/contracts-dfcc/loop_assigns-slice-from/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE dfcc-only
1+
KNOWNBUG
22
main.c
33
--no-malloc-may-fail --dfcc main --apply-loop-contracts
44
^EXIT=10$

regression/contracts/loop_assigns-slice-from/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE
1+
KNOWNBUG
22
main.c
33
--apply-loop-contracts _ --no-standard-checks
44
^EXIT=10$

regression/symtab2gb/multiple_symtabs/test.desc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,3 @@ user.json_symtab library.json_symtab
77
^\[2\] file library.adb line \d+ assertion: FAILURE$
88
^VERIFICATION FAILED$
99
--
10-
error

0 commit comments

Comments
 (0)