Skip to content

Commit c9d7269

Browse files
committed
SymEx: Restrict and sort imports
1 parent accac24 commit c9d7269

File tree

1 file changed

+16
-21
lines changed

1 file changed

+16
-21
lines changed

src/EVM/SymExec.hs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ module EVM.SymExec where
66

77
import Prelude hiding (Foldable(..))
88

9-
import Control.Arrow ((>>>))
109
import Control.Concurrent (forkIO, killThread)
1110
import Control.Concurrent.Async ( mapConcurrently)
1211
import Control.Concurrent.Chan (Chan, newChan, writeChan, readChan)
@@ -16,14 +15,14 @@ import Control.Concurrent.STM.TVar (TVar, newTVarIO, modifyTVar, readTVar, write
1615
import Control.Concurrent.STM.TMVar (TMVar, putTMVar, takeTMVar, newEmptyTMVarIO)
1716
import Control.Monad (when, forM_, forM, forever)
1817
import Control.Monad.Loops (whileM)
19-
import Control.Monad.IO.Unlift
18+
import Control.Monad.IO.Unlift (MonadUnliftIO, toIO, withRunInIO)
2019
import Control.Monad.Operational qualified as Operational
2120
import Control.Monad.ST (RealWorld, stToIO, ST)
22-
import Control.Monad.State.Strict
21+
import Control.Monad.State.Strict (liftIO, runStateT)
2322
import Data.ByteString (ByteString)
2423
import Data.ByteString qualified as BS
2524
import Data.DoubleWord (Word256)
26-
import Data.Foldable (Foldable(..))
25+
import Data.Foldable (length, foldl', foldr)
2726
import Data.List (sortBy, sort)
2827
import Data.List.NonEmpty qualified as NE
2928
import Data.Maybe (fromMaybe, listToMaybe, mapMaybe, catMaybes)
@@ -34,38 +33,36 @@ import Data.Set (Set)
3433
import Data.Set qualified as Set
3534
import Data.Text (Text)
3635
import Data.Text qualified as T
36+
import Data.Text.Encoding (encodeUtf8)
3737
import Data.Text.IO qualified as T
3838
import Data.Tree.Zipper qualified as Zipper
3939
import Data.Tuple (swap)
4040
import Data.Vector qualified as V
4141
import Data.Vector.Storable qualified as VS
4242
import Data.Vector.Storable.ByteString (vectorToByteString)
43-
import GHC.Conc (numCapabilities)
44-
import GHC.Natural
43+
import GHC.Conc (numCapabilities, getNumProcessors)
44+
import GHC.Generics (Generic)
45+
import GHC.Num.Natural (Natural)
46+
import Optics.Core
47+
import Options.Generic (ParseField, ParseFields, ParseRecord)
48+
import Text.Printf (printf)
49+
import Witch (into, unsafeInto)
4550

4651
import EVM (makeVm, abstractContract, initialContract, getCodeLocation, isValidJumpDest)
47-
import EVM.Exec
52+
import EVM.Exec (exec)
4853
import EVM.Fetch qualified as Fetch
4954
import EVM.ABI
5055
import EVM.Effects
5156
import EVM.Expr qualified as Expr
5257
import EVM.FeeSchedule (feeSchedule)
5358
import EVM.Format (formatExpr, formatPartial, formatPartialDetailed, showVal, indent, formatBinary, formatProp, formatState, formatError)
5459
import EVM.SMT qualified as SMT
55-
import EVM.Solvers
60+
import EVM.Solvers (SolverGroup, checkSatWithProps)
5661
import EVM.Stepper (Stepper)
5762
import EVM.Stepper qualified as Stepper
58-
import EVM.Traversals
63+
import EVM.Traversals (mapExpr, mapExprM, foldTerm)
5964
import EVM.Types hiding (Comp)
6065
import EVM.Types qualified
61-
import EVM.Expr (maybeConcStoreSimp)
62-
import GHC.Conc (getNumProcessors)
63-
import GHC.Generics (Generic)
64-
import Optics.Core
65-
import Options.Generic (ParseField, ParseFields, ParseRecord)
66-
import Text.Printf (printf)
67-
import Witch (into, unsafeInto)
68-
import Data.Text.Encoding (encodeUtf8)
6966
import EVM.Solidity (WarningData (..))
7067

7168
data LoopHeuristic
@@ -870,7 +867,7 @@ verifyInputsWithHandler solvers opts fetcher preState post cexHandler = do
870867
expandCex :: VM Symbolic -> SMTCex -> SMTCex
871868
expandCex prestate c = c { store = Map.union c.store concretePreStore }
872869
where
873-
concretePreStore = Map.mapMaybe (maybeConcStoreSimp . (.storage))
870+
concretePreStore = Map.mapMaybe (Expr.maybeConcStoreSimp . (.storage))
874871
. Map.filter (\v -> Expr.containsNode isConcreteStore v.storage)
875872
$ (prestate.env.contracts)
876873
isConcreteStore = \case
@@ -1235,7 +1232,7 @@ prettyBuf b = internalError $ "Unexpected symbolic buffer:\n" <> T.unpack (forma
12351232

12361233
calldataFromCex :: App m => SMTCex -> Expr Buf -> Sig -> m (Err ByteString)
12371234
calldataFromCex cex buf sig = do
1238-
let sigKeccak = keccakSig $ encodeUtf8 (callSig sig)
1235+
let sigKeccak = BS.take 4 $ keccakBytes $ encodeUtf8 (callSig sig)
12391236
pure $ (sigKeccak <>) <$> body
12401237
where
12411238
cd = defaultSymbolicValues $ subModel cex buf
@@ -1246,8 +1243,6 @@ calldataFromCex cex buf sig = do
12461243
forceConcrete :: (Expr Buf) -> Err ByteString
12471244
forceConcrete (ConcreteBuf k) = Right k
12481245
forceConcrete _ = Left "Symbolic buffer in calldata, cannot produce concrete model"
1249-
keccakSig :: ByteString -> ByteString
1250-
keccakSig = keccakBytes >>> BS.take 4
12511246

12521247
prettyCalldata :: SMTCex -> Expr Buf -> Text -> [AbiType] -> Text
12531248
prettyCalldata cex buf sig types = headErr errSig (T.splitOn "(" sig) <> "(" <> body <> ")" <> T.pack finalErr

0 commit comments

Comments
 (0)