Skip to content

Commit 31ca08f

Browse files
committed
Python bindings: Add test case for proclaim, proclaim_f
Related to #1676.
1 parent a6b7892 commit 31ca08f

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"fns":[{"abi":{"kind":"Rust"},"args":[{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::i32"}],"body":{"blocks":[{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::i32"}},"pos":"mir_proclaim.rs:2:5: 2:6","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::i32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Tuple::423c819a0b13bfc4"}},"pos":"mir_proclaim.rs:2:5: 2:10","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::i32"}},"kind":"Copy"},"R":{"data":{"rendered":{"kind":"int","size":4,"val":"1"},"ty":"ty::i32"},"kind":"Constant"},"kind":"CheckedBinaryOp","op":{"kind":"Add"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Tuple::423c819a0b13bfc4"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to compute `move _2 + const 1_i32`, which would overflow","pos":"mir_proclaim.rs:2:5: 2:10","target":"bb1"}},"blockid":"bb0"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::i32"}},"pos":"mir_proclaim.rs:2:5: 2:10","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::i32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Tuple::423c819a0b13bfc4"}},"kind":"Move"}}}],"terminator":{"kind":"Return","pos":"mir_proclaim.rs:3:2: 3:2"}},"blockid":"bb1"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::i32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::i32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Tuple::423c819a0b13bfc4"}]},"name":"mir_proclaim/87c4cc87::f","return_ty":"ty::i32","spread_arg":null}],"adts":[],"statics":[],"vtables":[],"traits":[],"intrinsics":[{"inst":{"def_id":"mir_proclaim/87c4cc87::f","kind":"Item","substs":[]},"name":"mir_proclaim/87c4cc87::f"}],"tys":[{"name":"ty::i32","ty":{"intkind":{"kind":"I32"},"kind":"Int"}},{"name":"ty::bool","ty":{"kind":"Bool"}},{"name":"ty::Tuple::423c819a0b13bfc4","ty":{"kind":"Tuple","tys":["ty::i32","ty::bool"]}}],"roots":["mir_proclaim/87c4cc87::f"]}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub fn f(x: i32) -> i32 {
2+
x + 1
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from pathlib import Path
2+
import unittest
3+
from saw_client import *
4+
from saw_client.crucible import cry, cry_f
5+
from saw_client.mir import Contract, i32
6+
7+
8+
class FContract1(Contract):
9+
def specification(self):
10+
x = self.fresh_var(i32, 'x')
11+
self.proclaim(cry_f('{x} < 0x7fffffff'))
12+
13+
self.execute_func(x)
14+
15+
r = self.fresh_var(i32, 'r')
16+
self.proclaim(cry_f('{r} == {x} + 1'))
17+
self.proclaim(cry_f('{r} <= 0x7fffffff'))
18+
self.returns(r)
19+
20+
21+
# Like FContract1, but using `proclaim_f` instead of `proclaim`.
22+
class FContract2(Contract):
23+
def specification(self):
24+
x = self.fresh_var(i32, 'x')
25+
self.proclaim_f('{x} < 0x7fffffff')
26+
27+
self.execute_func(x)
28+
29+
r = self.fresh_var(i32, 'r')
30+
self.proclaim_f('{r} == {x} + 1')
31+
self.proclaim_f('{r} <= 0x7fffffff')
32+
self.returns(r)
33+
34+
35+
class ProclaimTest(unittest.TestCase):
36+
def test_proclaim(self):
37+
connect(reset_server=True)
38+
if __name__ == "__main__": view(LogResults())
39+
bcname = str(Path('tests','saw','test-files', 'mir_proclaim.linked-mir.json'))
40+
mod = mir_load_module(bcname)
41+
42+
result1 = mir_verify(mod, 'mir_proclaim::f', FContract1())
43+
self.assertIs(result1.is_success(), True)
44+
45+
result2 = mir_verify(mod, 'mir_proclaim::f', FContract2())
46+
self.assertIs(result2.is_success(), True)
47+
48+
49+
if __name__ == "__main__":
50+
unittest.main()

0 commit comments

Comments
 (0)