formal-methods-minniethor/local-tests.txt
2021-07-09 16:01:21 +02:00

290 lines
9.7 KiB
Plaintext

/* Tests for the local instructions of tinyEVM. To be run on local-contract.txt */
op pcToConfig(pc: int): Config :=
match pc with
| 0 => @C( 0,
[@V(0)],
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 1 => @C( 1,
store [@V(0)] 0 @V(1),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 2 => @C( 2,
store (store [@V(0)] 0 @V(1)) 1 @V(~2),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 3 => @C( 1,
store [@V(0)] 0 @V(~1),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 4 => @C( 2,
store (store [@V(0)] 0 @V(~1)) 1 @V(1),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 5 => @C( 1,
store [@V(0)] 0 @V(0),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 6 => @C( 2,
store (store [@V(0)] 0 @V(0)) 1 @V(2),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 7 => @C( 1,
store [@V(0)] 0 @V(0),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 8 => @C( 2,
store (store [@V(0)] 0 @V(0)) 1 @V(~1),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 9 => @C( 1,
store [@V(0)] 0 @V(1),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 10 => @C( 2,
store (store [@V(0)] 0 @V(1)) 1 @V(336633572),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 11 => @C( 1,
store [@V(0)] 0 @V(1),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 12 => @C( 0,
[@V(0)],
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 13 => @C( 1,
store [@V(0)] 0 @V(246435),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 14 => @C( 1,
[@V(0)],
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 15 => @C( 2,
store [@V(0)] 1 @V(2),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 16 => @C( 1,
store [@V(0)] 0 @V(2),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 17 => @C( 2,
store (store [@V(0)] 0 @V(2)) 1 @V(1),
UPDATELISTDUMMY,
UPDATELISTDUMMY)
| 18 => @C( 0,
[@V(0)],
addUpdate(UPDATELISTDUMMY, @UP(1, @V(2))),
UPDATELISTDUMMY)
| 19 => @C( 1,
store [@V(0)] 0 @V(1),
addUpdate(UPDATELISTDUMMY, @UP(1, @V(2))),
UPDATELISTDUMMY)
| 20 => @C( 1,
store [@V(0)] 0 @V(2),
addUpdate(UPDATELISTDUMMY, @UP(1, @V(2))),
UPDATELISTDUMMY)
| 21 => @C( 2,
store (store [@V(0)] 0 @V(2)) 1 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @V(2))),
UPDATELISTDUMMY)
| 22 => @C( 2,
store (store [@V(0)] 0 @V(2)) 1 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @V(2))),
UPDATELISTDUMMY)
| 23 => @C( 0,
[@V(0)],
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
UPDATELISTDUMMY)
| 24 => @C( 1,
store [@V(0)] 0 @V(~42),
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
UPDATELISTDUMMY)
| 25 => @C( 1,
store [@V(0)] 0 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
UPDATELISTDUMMY)
| 26 => @C( 1,
store [@V(0)] 0 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
UPDATELISTDUMMY)
| 27 => @C( 0,
[@V(0)],
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
UPDATELISTDUMMY)
| 28 => @C( 1,
store [@V(0)] 0 @V(~1337),
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
UPDATELISTDUMMY)
| 29 => @C( 2,
store (store [@V(0)] 0 @V(~1337)) 1 @V(~67),
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
UPDATELISTDUMMY)
| 30 => @C( 0,
[@V(0)],
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @V(~1337))))
| 31 => @C( 1,
store [@V(0)] 0 @V(~67),
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @V(~1337))))
| 32 => @C( 1,
store [@V(0)] 0 @V(~1337),
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @V(~1337))))
| 33 => @C( 1,
store [@V(0)] 0 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @V(~1337))))
| 34 => @C( 1,
store [@V(0)] 0 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @V(~1337))))
| 35 => @C( 2,
store (store [@V(0)] 0 @T) 1 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @V(~1337))))
| 36 => @C( 0,
[@V(0)],
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 37 => @C( 1,
store [@V(0)] 0 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 38 => @C( 2,
store (store [@V(0)] 0 @T) 1 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 40 => @C( 2,
store (store [@V(0)] 0 @T) 1 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 41 => @C( 1,
store [@V(0)] 0 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 42 => @C( 1,
store [@V(0)] 0 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 43 => @C( 1,
store [@V(0)] 0 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 44 => @C( 0,
[@V(0)],
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 45 => @C( 0,
[@V(0)],
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 46 => @C( 1,
store [@V(0)] 0 @T,
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 47 => @C( 0,
[@V(0)],
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 48 => @C( 0,
[@V(0)],
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 49 => @C( 1,
store [@V(0)] 0 @V(1),
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| 51 => @C( 0,
[@V(0)],
addUpdate(UPDATELISTDUMMY, @UP(1, @T)),
addUpdate(UPDATELISTDUMMY, @UP(~67, @T)))
| _ => @C( 0,
[@V(0)],
UPDATELISTDUMMY,
UPDATELISTDUMMY);
const INTERVALS := 3;
test pcToStackTest expect SAT [?size: int, ?sa: array<AbsDom>, ?mem: array<AbsDom>,?in: AbsDom, ?stor: array<AbsDom>, ?cl: bool]
ExState{1}(?size, ?sa, ?mem, ?in, ?stor, ?cl),
(@V(1)) = (select (getStackArray(pcToConfig(1))) 0);
test soundnessTest expect SAT
for (!i: int) in interval(0, INTERVALS), (!pc: int) in interval((!i = 0)? (0): ((!i = 1)?(40):(51)), (!i = 0)? (39): ((!i = 1)?(50):(52))) // ugly way to only invoke the rule on certain intervals
[?size: int, ?sa: array<AbsDom>, ?mem: array<AbsDom>,?in: AbsDom, ?stor: array<AbsDom>, ?cl: bool]
ExState{!pc}(getStackSize(pcToConfig(!pc)), ?sa, ?mem, @T, ?stor, false),
stackMoreAbstractThanForall{getStackSize(pcToConfig(!pc))}(?sa, getStackArray(pcToConfig(!pc))),
arrayMoreAbstractThan{getUpdateSize(getMemUpdateList(pcToConfig(!pc)))}(?mem, getUpdates(getMemUpdateList(pcToConfig(!pc)))),
arrayMoreAbstractThan{getUpdateSize(getStorUpdateList(pcToConfig(!pc)))}(?stor, getUpdates(getStorUpdateList(pcToConfig(!pc))))
;
test precisionPossibleTest expect SAT
for (!i: int) in interval(0, INTERVALS), (!pc: int) in interval((!i = 0)? (0): ((!i = 1)?(40):(51)), (!i = 0)? (39): ((!i = 1)?(50):(52)))
[?size: int, ?sa: array<AbsDom>, ?mem: array<AbsDom>,?in: AbsDom, ?stor: array<AbsDom>, ?cl: bool]
ExState{!pc}(getStackSize(pcToConfig(!pc)), ?sa, ?mem, @T, ?stor, false),
stackEqualForall{getStackSize(pcToConfig(!pc))}(?sa, getStackArray(pcToConfig(!pc))),
arrayEqual{getUpdateSize(getMemUpdateList(pcToConfig(!pc)))}(?mem, getUpdates(getMemUpdateList(pcToConfig(!pc)))),
arrayEqual{getUpdateSize(getStorUpdateList(pcToConfig(!pc)))}(?stor, getUpdates(getStorUpdateList(pcToConfig(!pc))))
;
test precisionUniqueTest expect UNSAT
for (!i: int) in interval(0, INTERVALS), (!pc: int) in interval((!i = 0)? (0): ((!i = 1)?(40):(51)), (!i = 0)? (39): ((!i = 1)?(50):(52)))
[?size: int, ?sa: array<AbsDom>, ?mem: array<AbsDom>,?in: AbsDom, ?stor: array<AbsDom>, ?cl: bool]
ExState{!pc}(?size, ?sa, ?mem, ?in, ?stor, false),
(?size != getStackSize(pcToConfig(!pc)))
|| (stackInequalExists{getStackSize(pcToConfig(!pc))}(?sa, getStackArray(pcToConfig(!pc))))
|| (arrayInequalExists{getUpdateSize(getMemUpdateList(pcToConfig(!pc)))}(?mem, getUpdates(getMemUpdateList(pcToConfig(!pc)))))
|| (?in != @T)
|| (arrayInequalExists{getUpdateSize(getStorUpdateList(pcToConfig(!pc)))}(?stor, getUpdates(getStorUpdateList(pcToConfig(!pc)))))
;
/* Additional Tests concerning reachability, halting, etc. */
// pcs 39 and 50 should be unreachable because they are over-jumped
test unreachable39Test expect UNSAT
[?size: int, ?sa: array<AbsDom>, ?mem: array<AbsDom>,?in: AbsDom, ?stor: array<AbsDom>, ?cl: bool]
ExState{39}(?size, ?sa, ?mem, ?in, ?stor, ?cl);
test unreachable50Test expect UNSAT
[?size: int, ?sa: array<AbsDom>, ?mem: array<AbsDom>,?in: AbsDom, ?stor: array<AbsDom>, ?cl: bool]
ExState{50}(?size, ?sa, ?mem, ?in, ?stor, ?cl);
// Tests for correct halting
test haltSoundnessTest expect SAT
[?size: int, ?sa: array<AbsDom>, ?mem: array<AbsDom>,?in: AbsDom, ?stor: array<AbsDom>, ?cl: bool, ?res: AbsDom]
Halt(?stor, ?res, false),
valueMoreAbstractThan(?res, @V(0));
test haltPrecisePossibleTest expect SAT
[?size: int, ?sa: array<AbsDom>, ?mem: array<AbsDom>,?in: AbsDom, ?stor: array<AbsDom>, ?cl: bool, ?res: AbsDom]
Halt(?stor, @V(0), false);
// the only possible return results are 0 and T (due to stop and RETURN)
test haltPreciionUniquenessTest expect UNSAT
[?size: int, ?sa: array<AbsDom>, ?mem: array<AbsDom>,?in: AbsDom, ?stor: array<AbsDom>, ?cl: bool, ?res: AbsDom]
Halt(?stor, ?res, false),
(?res != @V(0) && ?res != @T);
// Reaching an exceptional state should be possible
test exceptionPossibleTest expect SAT
Exc(false);
test noCallTest2 expect UNSAT
Exc(true);
/*
query testQuery [?size: int, ?sa: array<AbsDom>, ?mem: array<AbsDom>,?in: AbsDom, ?stor: array<AbsDom>, ?cl: bool, ?res: AbsDom, ?p: AbsDom]
ExState{13}(?size, ?sa, ?mem, ?in, ?stor, ?cl), ?size > 0,
?p = select ?sa (?size -1),
?res = (isConcrete(?p))? (select ?mem (extractConcrete(?p))):(@T),
?res = @V(0); */