@@ -49,9 +49,8 @@ import EVM.ABI (Sig(..))
49
49
import qualified EVM hiding (bytecode )
50
50
import qualified EVM.Types as EVM hiding (FrameState (.. ))
51
51
import EVM.Expr hiding (op2 , inRange , div , xor , readStorage )
52
- import EVM.SymExec hiding (EquivResult , isPartial , reachable )
53
- import qualified EVM.SymExec as SymExec (EquivResult , ProofResult (.. ))
54
- import EVM.SMT (SMTCex (.. ), assertProps )
52
+ import EVM.SymExec hiding (isPartial , reachable )
53
+ import EVM.SMT (assertProps )
55
54
import EVM.Solvers
56
55
import EVM.Effects
57
56
import EVM.Format as Format
@@ -73,7 +72,7 @@ type ContractMap = M.Map (EVM.Expr EVM.EAddr) (EVM.Expr EVM.EContract, Id)
73
72
-- when we encounter a constructor call.
74
73
type CodeMap = M. Map Id (Contract , BS. ByteString , BS. ByteString )
75
74
76
- type EquivResult = ProofResult () ( T. Text , SMTCex ) T. Text T. Text
75
+ type EquivResult = EVM. ProofResult (String , EVM. SMTCex ) String
77
76
78
77
initAddr :: EVM. Expr EVM. EAddr
79
78
initAddr = EVM. SymAddr " entrypoint"
@@ -677,14 +676,14 @@ checkOp (Create _ _ _) = error "Internal error: invalid in range expression"
677
676
-- | Wrapper for the equivalenceCheck function of hevm
678
677
checkEquiv :: App m => SolverGroup -> [EVM. Expr EVM. End ] -> [EVM. Expr EVM. End ] -> m [EquivResult ]
679
678
checkEquiv solvers l1 l2 = do
680
- ( res, _) <- equivalenceCheck' solvers l1 l2 False
681
- pure $ fmap toEquivRes res
679
+ EqIssues res _ <- equivalenceCheck' solvers l1 l2 False
680
+ pure $ fmap ( toEquivRes . fst ) res
682
681
where
683
- toEquivRes :: SymExec . EquivResult -> EquivResult
684
- toEquivRes (Cex cex) = Cex (" \x1b [1mThe following input results in different behaviours\x1b [m" , cex)
685
- toEquivRes ( Qed a) = Qed a
686
- toEquivRes (SymExec . Unknown () ) = SymExec . Unknown " "
687
- toEquivRes (SymExec . Error b) = SymExec . Error ( T. pack b)
682
+ toEquivRes :: EVM . EquivResult -> EquivResult
683
+ toEquivRes (EVM. Cex cex) = EVM. Cex (" \x1b [1mThe following input results in different behaviours\x1b [m" , cex)
684
+ toEquivRes EVM. Qed = EVM. Qed
685
+ toEquivRes (EVM . Unknown s) = EVM . Unknown s
686
+ toEquivRes (EVM . Error b) = EVM . Error b
688
687
689
688
690
689
-- | Create the initial contract state before analysing a contract
@@ -738,7 +737,7 @@ getInitContractState solvers iface pointers preconds cmap = do
738
737
checkQueries :: App m => [EVM. Prop ] -> m (Error String () )
739
738
checkQueries queries = do
740
739
conf <- readConfig
741
- res <- liftIO $ checkSat solvers (assertProps conf queries)
740
+ res <- liftIO $ checkSat solvers Nothing (assertProps conf queries)
742
741
checkResult (makeCalldata iface) Nothing [toVRes msg res]
743
742
744
743
makeSymAddr n = EVM. WAddr (EVM. SymAddr $ " freshSymAddr" <> (T. pack $ show n))
@@ -955,15 +954,15 @@ checkInputSpaces solvers l1 l2 = do
955
954
let queries = fmap (assertProps conf) [ [ EVM. PNeg (EVM. por p1), EVM. por p2 ]
956
955
, [ EVM. por p1, EVM. PNeg (EVM. por p2) ] ]
957
956
958
- results <- liftIO $ mapConcurrently (checkSat solvers) queries
957
+ results <- liftIO $ mapConcurrently (checkSat solvers Nothing ) queries
959
958
let results' = case results of
960
959
[r1, r2] -> [ toVRes " \x1b [1mThe following inputs are accepted by Act but not EVM\x1b [m" r1
961
960
, toVRes " \x1b [1mThe following inputs are accepted by EVM but not Act\x1b [m" r2 ]
962
961
_ -> error " Internal error: impossible"
963
962
964
- case all isQed results' of
965
- True -> pure [Qed () ]
966
- False -> pure $ filter (/= Qed () ) results'
963
+ case all EVM. isQed results' of
964
+ True -> pure [EVM. Qed ]
965
+ False -> pure $ filter (/= EVM. Qed ) results'
967
966
968
967
969
968
@@ -978,7 +977,7 @@ checkAbi solver contract cmap = do
978
977
evmBehvs <- getRuntimeBranches solver hevmstorage (txdata, [] ) 0 -- TODO what freshAddr goes here?
979
978
conf <- readConfig
980
979
let queries = fmap (assertProps conf) $ filter (/= [] ) $ fmap (checkBehv selectorProps) evmBehvs
981
- res <- liftIO $ mapConcurrently (checkSat solver) queries
980
+ res <- liftIO $ mapConcurrently (checkSat solver Nothing ) queries
982
981
checkResult (txdata, [] ) Nothing (fmap (toVRes msg) res)
983
982
984
983
where
@@ -1034,19 +1033,19 @@ assertSelector txdata sig =
1034
1033
1035
1034
-- * Utils
1036
1035
1037
- toVRes :: T. Text -> CheckSatResult -> EquivResult
1036
+ toVRes :: String -> EVM. SMTResult -> EquivResult
1038
1037
toVRes msg res = case res of
1039
- Sat cex -> Cex (msg, cex)
1040
- EVM.Solvers. Unknown e -> SymExec . Unknown ( T. pack e)
1041
- Unsat -> Qed ()
1042
- EVM.Solvers. Error e -> SymExec . Error ( T. pack e)
1038
+ EVM. Cex cex -> EVM. Cex (msg, cex)
1039
+ EVM. Unknown e -> EVM . Unknown e
1040
+ EVM. Qed -> EVM. Qed
1041
+ EVM. Error e -> EVM . Error e
1043
1042
1044
1043
1045
1044
checkResult :: App m => Calldata -> Maybe Sig -> [EquivResult ] -> m (Error String () )
1046
1045
checkResult calldata sig res =
1047
- case any isCex res of
1046
+ case any EVM. isCex res of
1048
1047
False ->
1049
- case any isUnknown res || any isError res of
1048
+ case any EVM. isUnknown res || any EVM. isError res of
1050
1049
True -> do
1051
1050
showMsg " \x1b [41mNo discrepancies found but timeouts or solver errors were encountered. \x1b [m"
1052
1051
pure $ Failure $ NE. singleton (nowhere, " Failure: Cannot prove equivalence." )
@@ -1055,7 +1054,7 @@ checkResult calldata sig res =
1055
1054
pure $ Success ()
1056
1055
True -> do
1057
1056
let cexs = mapMaybe getCex res
1058
- showMsg $ T. unpack . T. unlines $ [ " \x1b [41mNot equivalent.\x1b [m" , " " , " -----" , " " ] <> (intersperse (T. unlines [ " " , " -----" ]) $ fmap (\ (msg, cex) -> msg <> " \n " <> formatCex (fst calldata) sig cex) cexs)
1057
+ showMsg $ T. unpack . T. unlines $ [ " \x1b [41mNot equivalent.\x1b [m" , " " , " -----" , " " ] <> (intersperse (T. unlines [ " " , " -----" ]) $ fmap (\ (msg, cex) -> T. pack msg <> " \n " <> formatCex (fst calldata) sig cex) cexs)
1059
1058
pure $ Failure $ NE. singleton (nowhere, " Failure: Cannot prove equivalence." )
1060
1059
1061
1060
-- | Pretty prints a list of hevm behaviours for debugging purposes
0 commit comments