@@ -2614,6 +2614,144 @@ tests = testGroup "hevm"
26142614 assertEqualM " number of errors" 0 numErrs
26152615 assertEqualM " number of counterexamples" 1 numCexes
26162616 assertEqualM " number of qed-s" 0 numQeds
2617+ , test " call-balance-symb" $ do
2618+ Just c <- solcRuntime " C"
2619+ [i |
2620+ contract C {
2621+ function checkval(address inputAddr) public {
2622+ uint256 balance = inputAddr.balance;
2623+ assert(balance < 10);
2624+ }
2625+ }
2626+ |]
2627+ let sig = Just (Sig " checkval(address)" [AbiAddressType ])
2628+ (expr, ret) <- withDefaultSolver $ \ s -> checkAssert s defaultPanicCodes c sig [] defaultVeriOpts
2629+ let numCexes = sum $ map (fromEnum . isCex) ret
2630+ let numErrs = sum $ map (fromEnum . isError) ret
2631+ assertBoolM " The expression MUST NOT be partial" $ Prelude. not (Expr. containsNode isPartial expr)
2632+ assertEqualM " number of errors" 0 numErrs
2633+ assertEqualM " number of counterexamples" 1 numCexes
2634+ , test " call-balance-symb2" $ do
2635+ Just c <- solcRuntime " C"
2636+ [i |
2637+ contract C {
2638+ function checkval() public {
2639+ uint256 balance = address(0xacab).balance;
2640+ assert(balance < 10);
2641+ }
2642+ }
2643+ |]
2644+ let sig = Just (Sig " checkval()" [] )
2645+ (expr, ret) <- withDefaultSolver $ \ s -> checkAssert s defaultPanicCodes c sig [] defaultVeriOpts
2646+ let numCexes = sum $ map (fromEnum . isCex) ret
2647+ let numErrs = sum $ map (fromEnum . isError) ret
2648+ assertBoolM " The expression MUST NOT be partial" $ Prelude. not (Expr. containsNode isPartial expr)
2649+ assertEqualM " number of errors" 0 numErrs
2650+ assertEqualM " number of counterexamples" 1 numCexes
2651+ , test " call-balance-concrete-pass" $ do
2652+ Just c <- solcRuntime " C"
2653+ [i |
2654+ interface Vm {
2655+ function deal(address,uint256) external;
2656+ }
2657+ contract Target {
2658+ }
2659+ contract C {
2660+ function checkval() public {
2661+ Target t = new Target();
2662+ Vm vm = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
2663+ vm.deal(address(t), 5);
2664+ uint256 balance = address(t).balance;
2665+ assert(balance < 10);
2666+ }
2667+ }
2668+ |]
2669+ let sig = Just (Sig " checkval()" [] )
2670+ (expr, ret) <- withDefaultSolver $ \ s -> checkAssert s defaultPanicCodes c sig [] defaultVeriOpts
2671+ let numErrs = sum $ map (fromEnum . isError) ret
2672+ let numQeds = sum $ map (fromEnum . isQed) ret
2673+ assertBoolM " The expression MUST NOT be partial" $ Prelude. not (Expr. containsNode isPartial expr)
2674+ assertEqualM " number of errors" 0 numErrs
2675+ assertEqualM " number of qed-s" 1 numQeds
2676+ , test " call-balance-concrete-fail" $ do
2677+ Just c <- solcRuntime " C"
2678+ [i |
2679+ interface Vm {
2680+ function deal(address,uint256) external;
2681+ }
2682+ contract Target {
2683+ }
2684+ contract C {
2685+ function checkval() public {
2686+ Target t = new Target();
2687+ Vm vm = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
2688+ vm.deal(address(t), 5);
2689+ uint256 balance = address(t).balance;
2690+ assert(balance < 5);
2691+ }
2692+ }
2693+ |]
2694+ let sig = Just (Sig " checkval()" [] )
2695+ (expr, ret) <- withDefaultSolver $ \ s -> checkAssert s defaultPanicCodes c sig [] defaultVeriOpts
2696+ let numErrs = sum $ map (fromEnum . isError) ret
2697+ let numCexes = sum $ map (fromEnum . isCex) ret
2698+ assertBoolM " The expression MUST NOT be partial" $ Prelude. not (Expr. containsNode isPartial expr)
2699+ assertEqualM " number of errors" 0 numErrs
2700+ assertEqualM " number of counterexamples" 1 numCexes
2701+ , test " call-extcodehash-symb1" $ do
2702+ Just c <- solcRuntime " C"
2703+ [i |
2704+ contract C {
2705+ function checkval(address inputAddr) public {
2706+ bytes32 hash = inputAddr.codehash;
2707+ assert(uint(hash) < 10);
2708+ }
2709+ }
2710+ |]
2711+ let sig = Just (Sig " checkval(address)" [AbiAddressType ])
2712+ (expr, ret) <- withDefaultSolver $ \ s -> checkAssert s defaultPanicCodes c sig [] defaultVeriOpts
2713+ let numCexes = sum $ map (fromEnum . isCex) ret
2714+ let numErrs = sum $ map (fromEnum . isError) ret
2715+ assertBoolM " The expression MUST NOT be partial" $ Prelude. not (Expr. containsNode isPartial expr)
2716+ assertEqualM " number of errors" 0 numErrs
2717+ assertEqualM " number of counterexamples" 1 numCexes
2718+ , test " call-extcodehash-symb2" $ do
2719+ Just c <- solcRuntime " C"
2720+ [i |
2721+ contract C {
2722+ function checkval() public {
2723+ bytes32 hash = address(0xacab).codehash;
2724+ assert(uint(hash) < 10);
2725+ }
2726+ }
2727+ |]
2728+ let sig = Just (Sig " checkval()" [] )
2729+ (expr, ret) <- withDefaultSolver $ \ s -> checkAssert s defaultPanicCodes c sig [] defaultVeriOpts
2730+ let numCexes = sum $ map (fromEnum . isCex) ret
2731+ let numErrs = sum $ map (fromEnum . isError) ret
2732+ assertBoolM " The expression MUST NOT be partial" $ Prelude. not (Expr. containsNode isPartial expr)
2733+ assertEqualM " number of errors" 0 numErrs
2734+ assertEqualM " number of counterexamples" 1 numCexes
2735+ , test " call-extcodehash-concrete-fail" $ do
2736+ Just c <- solcRuntime " C"
2737+ [i |
2738+ contract Target {
2739+ }
2740+ contract C {
2741+ function checkval() public {
2742+ Target t = new Target();
2743+ bytes32 hash = address(t).codehash;
2744+ assert(uint(hash) == 8);
2745+ }
2746+ }
2747+ |]
2748+ let sig = Just (Sig " checkval()" [] )
2749+ (expr, ret) <- withDefaultSolver $ \ s -> checkAssert s defaultPanicCodes c sig [] defaultVeriOpts
2750+ let numErrs = sum $ map (fromEnum . isError) ret
2751+ let numCexes = sum $ map (fromEnum . isCex) ret
2752+ assertBoolM " The expression MUST NOT be partial" $ Prelude. not (Expr. containsNode isPartial expr)
2753+ assertEqualM " number of errors" 0 numErrs
2754+ assertEqualM " number of counterexamples" 1 numCexes
26172755 , test " jump-symbolic" $ do
26182756 Just c <- solcRuntime " C"
26192757 [i |
0 commit comments