Giter VIP home page Giter VIP logo

ethbmc's Introduction

EthBMC: A Bounded Model Checker for Smart Contracts

This is the code repository for our Usenix Security 2020 paper EthBMC.

The introduction of smart contracts has significantly advanced the state-of-the-art in cryptocurrencies. Smart contracts are programs who live on the blockchain, governing the flow of money. However, the promise of monetary gain has attracted miscreants, resulting in spectacular hacks which resulted in the loss of millions worth of currency. In response, several powerful static analysis tools were developed to address these problems. We surveyed eight recently proposed static analyzers for Ethereum smart contracts and found that none of them captures all relevant features of the Ethereum ecosystem. For example, we discovered that a precise memory model is missing and inter-contract analysis is only partially supported.

Based on these insights, we present the design and implementation of, a bounded model checker based on symbolic execution which provides a precise model of the Ethereum network. We demonstrate its capabilities in a series of experiments. First, we compare against the eight aforementioned tools, showing that even relatively simple toy examples can obstruct other analyzers. Further proving that precise modeling is indispensable, we leverage ETHBmc capabilities for automatic vulnerability scanning. We perform a large-scale analysis of roughly 2.2 million accounts currently active on the blockchain and automatically generate 5,905 valid inputs which trigger a vulnerability. From these, 1,989 can destroy a contract at will (so called suicidal contracts) and the rest can be used by an adversary to arbitrarily extract money. Finally, we compare our large-scale analysis against two previous analysis runs, finding significantly more inputs (22.8%) than previous approaches.

Requirements

To compile and use EthBMC you will need:

  • Rust nightly (tested with version 1.44.0)
  • evm stand alone executable; make sure it is in your $PATH (originally with version 1.8.17; also tested with 1.10.4 - available in the Geth & Tools bundle)
  • We offer support for three different smt solvers (tested with yices2 version 2.6.1. Note we recommend Yices2; see Section 6.5 in the paper):

When using the webservice-version (see esvm/bin):

  • Configuration is done using a Rocket.toml
  • When using the Service with timeouts the service expects a ethbmc binary in the PATH

Binaries

  • ethbmc: Simple stand alone binary
  • ethbmc-service: Webservice which accepts accounts and returns the result as json
  • ethbmc-scheduler: Accepts two lists, an account list and a server list, then distributes the accounts between the backing servers running a service instance

Building

cargo build --release

Note when analyzing big contracts you might have to increase Rusts stack size, see here.

Usage

EthBMC 1.0.0
EthBMC: A Bounded Model Checker for Smart Contracts

USAGE:
    ethbmc [FLAGS] [OPTIONS] <INPUT>

FLAGS:
    -x, --acc                 The input is an Ethereum account address, must be used with parity backend, mainnet only
        --concrete-copy       Use concrete calldatacopy
    -d, --debug-grap          Dump debug graph after analysis
        --no-optimizations    Disable all optimizations
        --dump-solver         Dump all solver queries to ./queries
    -h, --help                Prints help information
        --json                Output json without logging
        --list                The input is a list of Ethereum account address, writes the result to a csv file in the
                              output folder
        --no-verify           Skip verification phase.
    -V, --version             Prints version information

OPTIONS:
        --block <block>                      The blocknumber to evaluate, defaults to latest block. Note you will need
                                             an archive node for anaylzing blocks which are not the latest.
    -c, --call-bound <call_bound>            Set bound for calls
        --cores <cores>                      Set the amount of cores the se can use
        --ip <ip>                            The ip of a running node.
    -b, --loop-bound <loop_bound>            Set bound for loops
    -m, --message-bound <message_bound>      Set bound for message iteration
        --port <port>                        The port of a running node.
        --solver <solver>                    The SMT solver to use: z3, boolector, yices2 [yices2]
        --solver-timeout <solver-timeout>    Set solver timeout in milliseconds

ARGS:
    <INPUT>    Set input file / address

The easiest way to use EthBMC is to create an input yml file (see examples):

./target/release/ethbmc examples/rubixi/rubixi.yml

When you have a running Ethereum node you can also use it to analyze an on-chain account:

./target/release/ethbmc -x --ip ip.to.your.node  0xAccount_Address

When you have an archive node you can also use it to analyze an account at a specific block:

./target/release/ethbmc -x --ip ip.to.your.node --block block_number_to_analyze 0xAccount_Address

Note when executing the parity example (examples/parity) we recommend limiting the loop execution to 1 and use concrete-copy. The bug can still be found without these restrictions, but it takes a long time.

./target/release/ethbmc -b1 --concrete-copy examples/parity/parity.yml

YAML Format

The yaml format allows to easily initialise a multi-account environment offline. Under state you list all the accounts which should be present in the environment. Each account gets its address as a key. Additionally you can set the balance of the accounts, the nonce and the code field. Optionally you can supply storage. These are key-value pairs which get loaded as the initial storage of an account, otherwise it is assumed empty. Additionally you must supply a victim address. This is the account from which the analysis is started. See for example the example for analysing the parity hack:

state: 
    # Wallet
    0xad62f08b3b9f0ecc7251befbeff80c9bb488fe9:
        balance: 0x8AC7230489E80000
        nonce: 0x0
        code: 606060...
        storage:
            0x0: 0xcafecafecafecafecafecafecafecafecafecafe # "owner"

    # Receiver
    0xcafecafecafecafecafecafecafecafecafecafe:
        balance: 0x0
        nonce: 0x0
        code: 60606...

victim: 0xad62f08b3b9f0ecc7251befbeff80c9bb488fe9

We initialise two accounts, the wallet account, which holds the stub for forwarding all requests to the library, and the Receiver account, the parity library. We additionally supply some funds to it, to simulate a hack of the wallet, as well as setting the first storage variable (0x0) (the variable holding the address of the library contract) to the second account in the environment.

Patched Parity Node

For the on-chain analysis (Section 6.2) we used a patched parity node to obtain the storage of an account (the code can be found here). You can still use a normal node which supports the web3 API. However, the analysis then does not take storage variables into account (all variables are assumed to be zero). Note to analyze blocks at an earlier time you will need to use a patched archive node.

Tests

  • Test can only be run one at a time at the moment (cargo test -- --test-threads=1)
  • Integration tests take a long time and should allways be run with optimizations (cargo test integra --release -- --ignored)
  • Some tests need a deployed parity instance, set PARITY_IP env var to the corresponding ip (PARITY_IP=127.0.0.1 cargo test parity -- --test-threads=1 --ignored)

You can run all test with the supplied shell script (requires archive patched parity node):

	PARITY_IP=127.0.0.1 ./run_all_test.sh

BibTeX

When you cite our work please use the following bibtex entry:

@inproceedings {frank2020ethbmc,
	title={ETHBMC: A Bounded Model Checker for Smart Contracts},
  	author={Frank, Joel and Aschermann, Cornelius and Holz, Thorsten},
	booktitle = {USENIX Security Symposium (USENIX Security)},
	year = {2020},
}

Acknowledgement

We would like to thank the parity team for open-sourcing their code.

ethbmc's People

Contributors

f0rki avatar joool avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

ethbmc's Issues

thread 'main' panicked

Hi, I have three questions on using EthBMC.

[Q1] After following the build instruction, I tried to use EthBMC by running the command in README.md:

./target/release/ethbmc examples/rubixi/rubixi.yml

However, I encountered a following error message:

thread 'main' panicked at 'Could not initialize logger: Io(Os { code: 2, kind: NotFound, message: "No such file or directory" })', esvm/src/main.rs:60:45
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Could you explain how I can handle this error?
I am working on Ubuntu 18.04 and my rust version is 1.47.0-nightly.

[Q2] I wonder how I can construct corresponding yml files to test new smart contracts (other than contracts in examples directory).

Could you provide more guidance? For example, what things should be included in storage part?

[Q3] Is it possible to simply provide a source code (i.e., sol file) to use EthBMC? I wonder why I should create a yml file separately.

How to configure ETHBMC to reduce timeout events

Summary of the problem

Hi, I ran a multiprocess script on top of ETHMBMC to analyze multiple smart contracts offline where a timeout of 30 minutes for each contract is set. The result showed a total of 9 contracts, with a timeout rate of 55.6%.

20211202221110

SMT Solver

Yices 2.6.2

Expected behavior

EthBMC successfully completes the analysis of 9 contracts and the timeout rate does not exceed 22%.

Actual behavior

Timeout occurred in 5 contracts. All contracts use the same command options-b1 --json and real-world bytecode and account address in yml file but balance fixed at "0x100000" and nonce at "0x1000000". There is only one contract in each yml file.

I summarized the command options that might avoid timeouts:

  • -b is limit to 1

  • --concrete-copy is used(It seems to affect code coverage due to the use of concrete values instead of symbolic values)

  • --solver-timeout(The default is 2 minutes, but I often observe it timeout in the running log)

Please give me some suggestions to reduce the timeout rate, even at the expense of code coverage.

Working examples?

Hi, could you provide any working examples that EthBMC successfully finds bugs?

I have tried the command ./target/release/ethbmc examples/rubixi/rubixi.yml in README, but it did not terminate within 20 minutes.

Smaller examples in here were terminated within 1 minute. However, EthBMC prodcued Could not find any attacks! message for all three examples:

./target/release/ethbmc examples/unprotected_function/unprotected_suicide.yml
./target/release/ethbmc examples/unprotected_function/unprotected_call_args.yml
./target/release/ethbmc examples/unprotected_function/unprotected_call.yml

I would like to see results produced by EthBMC when it successfully finds vulnerabilities.

How to use on-chain analysis correctly in EthBMC

Summary of the problem

Hi, I used EthBMC for on chain contract address list analysis with the command:

/target/release/ethbmc --ip 127.0.0.1 --list -b 1 ./contract_list/contract_list9-4.txt

where contract_list9-4.txt consists of 4 non-self-destructed contracts with real Ethereum account address:

0xaeb960ed44c8a4ce848c50ef451f472a503456b2

0xe2fd97cdd6182c1223ff8bc6344abaf7132b51d5

0x2a103c2023fb2ad490c5ab2a2b05d9fbc301ad34

0xdb404188f3428f80fcac37a2ee7a3391f5d28c48

and a local parity node is created with parity -c config.toml where the contents of config.toml:

[parity]
light=true
base_path="/home/work/parity_light"
[rpc]
cors=["all"]
interface=["local"]
hosts=["all"]
[misc]
logging="sync=debug"
log_file="/home/work/parity_light.log"
color=true

Parity version

Parity-Ethereum/v2.7.2-stable-2662d19-20200206/x86_64-unknown-linux-gnu/rustc1.41.0

OS / Environment

Ubuntu 18.04.6 LTS

Expected behavior

EthBMS successfully analyzes all of contracts and outputs a CSV file.

Actual behavior

The on chain analysis fails to complete. It seems

At the first attempt, the analysis was terminated by the panic:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error(JsonRpcError(Error { code: ServerError(-32065), message: "OnDemand request maximum backoff iterations exceeded", data: None }), State { next_error: None, backtrace: InternalBacktrace { backtrace: None } })', parity_connector/src/lib.rs:58:14

The second attempt came up with another one:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error(JsonRpcError(Error { code: ServerError(-32042), message: "Bad response on request: [ Body ]. Error cause was EmptyResponse, (majority count: 1 / total: 1)", data: None }), State { next_error: None, backtrace: InternalBacktrace { backtrace: None } })', parity_connector/src/lib.rs:58:14

It seems to be blamed on the local Parity node I created instead of ETHBMC, but how do I configure a Parity node to use the on-chain analysis function of EthBMC?

Any relevant logs

EthBMC-master$ RUST_BACKTRACE=1 ./target/release/ethbmc --ip 127.0.0.1 --list -b 1 ./contract_list/contract_list9-4.txt
[2021-12-01][16:52:47][ethbmc][INFO] =========================================================
[2021-12-01][16:52:47][ethbmc][INFO] Analyzing account 1 of 4
[2021-12-01][16:52:47][ethbmc][INFO] =========================================================
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error(JsonRpcError(Error { code: ServerError(-32042), message: "Bad response on request: [ Body ]. Error cause was EmptyResponse, (majority count: 1 / total: 1)", data: None }), State { next_error: None, backtrace: InternalBacktrace { backtrace: Some(   0: error_chain::backtrace::imp::InternalBacktrace::new
   1: <error_chain::State as core::default::Default>::default
   2: <jsonrpc_client_core::Error as core::convert::From<jsonrpc_client_core::ErrorKind>>::from
   3: jsonrpc_client_core::response::parse
   4: <jsonrpc_client_core::RpcRequest<T,F> as futures::future::Future>::poll
   5: futures::task_impl::Spawn<T>::poll_future_notify
   6: std::thread::local::LocalKey<T>::with
   7: parity_connector::ParityConnector::block_by_number
   8: esvm::se::env::Env::from_chain
   9: esvm::se::env::SeEnviroment::from_chain
  10: ethbmc::analysis
  11: ethbmc::main
  12: std::sys_common::backtrace::__rust_begin_short_backtrace
  13: std::rt::lang_start::{{closure}}
  14: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/core/src/ops/function.rs:259:13
      std::panicking::try::do_call
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/std/src/panicking.rs:406:40
      std::panicking::try
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/std/src/panicking.rs:370:19
      std::panic::catch_unwind
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/std/src/panic.rs:133:14
      std::rt::lang_start_internal::{{closure}}
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/std/src/rt.rs:128:48
      std::panicking::try::do_call
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/std/src/panicking.rs:406:40
      std::panicking::try
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/std/src/panicking.rs:370:19
      std::panic::catch_unwind
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/std/src/panic.rs:133:14
      std::rt::lang_start_internal
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/std/src/rt.rs:128:20
  15: main
  16: __libc_start_main
             at /build/glibc-S9d2JN/glibc-2.27/csu/../csu/libc-start.c:310
  17: _start
) } })', parity_connector/src/lib.rs:58:14
stack backtrace:
   0: rust_begin_unwind
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/std/src/panicking.rs:498:5
   1: core::panicking::panic_fmt
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/core/src/panicking.rs:107:14
   2: core::result::unwrap_failed
             at /rustc/6db0a0e9a4a2f55b1a85954e114ada0b45c32e45/library/core/src/result.rs:1613:5
   3: parity_connector::ParityConnector::block_by_number
   4: esvm::se::env::Env::from_chain
   5: esvm::se::env::SeEnviroment::from_chain
   6: ethbmc::analysis
   7: ethbmc::main

How to specify storage

Hi, I thought about the example for analysing the parity hack:

state: 
    # Wallet
    0xad62f08b3b9f0ecc7251befbeff80c9bb488fe9:
        balance: 0x8AC7230489E80000
        nonce: 0x0
        code: 606060...
        storage:
            0x0: 0xcafecafecafecafecafecafecafecafecafecafe # "owner"

    # Receiver
    0xcafecafecafecafecafecafecafecafecafecafe:
        balance: 0x0
        nonce: 0x0
        code: 60606...

victim: 0xad62f08b3b9f0ecc7251befbeff80c9bb488fe9

The item of storage seems to be the key for inter-contract analysis, but how do I determine which storage variable(0x0 in your example) corresponds to the library contract address for different contracts(maybe 0x2).

Besides, for the contracts whose source code is available, we can learn the information of storage from the contract ABI(The storage with"type":"address"may represent a library contract), what about ones without source code.

Finally, if the address of Receiver is not explicitly indicated in Sender's storage, inter-contract analysis is not performed. Is it right?

Threads not closed properly after analysis

Hi, I tried the easiest way to use EthBMC ./target/release/ethbmc examples/rubixi/rubixi.yml, but it reported errors. Please give me some hints.

thread '<unnamed>' panicked at 'attempted to leave type `internal::Local` uninitialized, which is invalid', /rustc/a435b49e86d16e98dcc6595dd471f95e823f41aa/library/core/src/mem/mod.rs:660:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread '<unnamed>' panicked at 'attempted to leave type `internal::Local` uninitialized, which is invalid', /rustc/a435b49e86d16e98dcc6595dd471f95e823f41aa/library/core/src/mem/mod.rs:660:9
thread '<unnamed>' panicked at 'attempted to leave type `internal::Local` uninitialized, which is invalid', /rustc/a435b49e86d16e98dcc6595dd471f95e823f41aa/library/core/src/mem/mod.rs:660:9
thread '<unnamed>' panicked at 'attempted to leave type `internal::Local` uninitialized, which is invalid', /rustc/a435b49e86d16e98dcc6595dd471f95e823f41aa/library/core/src/mem/mod.rs:660:9
thread 'thread '<unnamed><unnamed>' panicked at '' panicked at 'attempted to leave type `internal::Local` uninitialized, which is invalidattempted to leave type `internal::Local` uninitialized, which is invalid', ', /rustc/a435b49e86d16e98dcc6595dd471f95e823f41aa/library/core/src/mem/mod.rs/rustc/a435b49e86d16e98dcc6595dd471f95e823f41aa/library/core/src/mem/mod.rs::660660::99

[2021-07-05][03:00:51][esvm][INFO] =========================================================
[2021-07-05][03:00:51][esvm][INFO] Starting first round.
[2021-07-05][03:00:51][esvm][INFO] =========================================================
thread 'main' panicked at 'attempted to leave type `internal::Local` uninitialized, which is invalid', /rustc/a435b49e86d16e98dcc6595dd471f95e823f41aa/library/core/src/mem/mod.rs:660:9
thread '<unnamed>' panicked at 'attempted to leave type `internal::Local` uninitialized, which is invalid', /rustc/a435b49e86d16e98dcc6595dd471f95e823f41aa/library/core/src/mem/mod.rs:660:9
thread 'main' panicked at 'Threads not closed properly after analysis: Any { .. }', esvm/src/se/symbolic_graph.rs:211:18

thread panicked while panicking. aborting.

Working example rubixi - panic exeption

I installed in ubuntu 18.04 ethBMC with:

  • rustc 1.52.0-nightly (caca2121f 2021-03-05)
  • geth 1.8.27-stable-4bcc0a37
  • Yices 2.6.2

After launching the' cargo build --release' in the main EthBMC folder,
I receive some following warnings:
------------------- 1 -------------------------
Compiling ethereum-newtypes v0.1.0 (/home/mirkostad/Programmi/EthBMC-master/evmexec/ethereum-newtypes)
warning: unused doc comment
--> evmexec/ethereum-newtypes/src/lib.rs:16:1
|
16 | /// A wrapper around U256, pads to even length by default
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ rustdoc does not generate documentation for macro invocations
|
= note: #[warn(unused_doc_comments)] on by default
= help: to document an item produced by a macro, the macro must produce the documentation as part of its expansion

warning: unused doc comment
--> evmexec/ethereum-newtypes/src/lib.rs:19:1
|
19 | /// An ethereum account address, pads to 20 byte hex representation by default
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ rustdoc does not generate documentation for macro invocations
|
= help: to document an item produced by a macro, the macro must produce the documentation as part of its expansion

warning: unused doc comment
--> evmexec/ethereum-newtypes/src/lib.rs:22:1
|
22 | /// An ethereum Hash, pads to 32 byte hex representation by default
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ rustdoc does not generate documentation for macro invocations
|
= help: to document an item produced by a macro, the macro must produce the documentation as part of its expansion

warning: 3 warnings emitted

-------------------------------- 2 ----------------------------------------------------
Compiling evmexec v0.1.0 (/home/mirkostad/Programmi/EthBMC-master/evmexec)
warning: use of deprecated associated function std::error::Error::description: use the Display impl or to_string()
--> evmexec/src/evm.rs:101:62
|
101 | Err(why) => panic!("couldn't spawn evm: {}", why.description()),
| ^^^^^^^^^^^
|
= note: #[warn(deprecated)] on by default

warning: variant is never constructed: Yes
--> evmexec/src/evm.rs:239:5
|
239 | Yes,
| ^^^
|
= note: #[warn(dead_code)] on by default

warning: 2 warnings emitted

---------------------------------------------- 3 -----------------------------------------------------------
warning: unused doc comment
--> parity_connector/src/types.rs:27:1
|
27 | /// A rust representation of an ethereum block, reduced to the fields used by ethAEG
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ rustdoc does not generate documentation for macro invocations
|
= note: #[warn(unused_doc_comments)] on by default
= help: to document an item produced by a macro, the macro must produce the documentation as part of its expansion

warning: method eth_blockNumber should have a snake case name
--> parity_connector/src/client.rs:9:12
|
9 | pub fn eth_blockNumber(&mut self) -> RpcRequest;
| ^^^^^^^^^^^^^^^ help: convert the identifier to snake case: eth_block_number
|
= note: #[warn(non_snake_case)] on by default

warning: method eth_getBlockByNumber should have a snake case name
--> parity_connector/src/client.rs:12:12
|
12 | pub fn eth_getBlockByNumber(&mut self, number: BlockSelector, as_tx: bool) -> RpcRequest;
| ^^^^^^^^^^^^^^^^^^^^ help: convert the identifier to snake case: eth_get_block_by_number

warning: method eth_getCode should have a snake case name
--> parity_connector/src/client.rs:15:12
|
15 | pub fn eth_getCode(&mut self, address: Address, number: BlockSelector) -> RpcRequest;
| ^^^^^^^^^^^ help: convert the identifier to snake case: eth_get_code

warning: method eth_getBalance should have a snake case name
--> parity_connector/src/client.rs:18:12
|
18 | pub fn eth_getBalance(&mut self, address: Address, number: BlockSelector) -> RpcRequest;
| ^^^^^^^^^^^^^^ help: convert the identifier to snake case: eth_get_balance

warning: method eth_getStorage should have a snake case name
--> parity_connector/src/client.rs:20:12
|
20 | pub fn eth_getStorage(&mut self, address: Address, number: BlockSelector) -> RpcRequest;
| ^^^^^^^^^^^^^^ help: convert the identifier to snake case: eth_get_storage

warning: 6 warnings emitted

------------------------------------------------------ 4 -----------------------------------------------------
Compiling esvm v0.1.0 (/home/mirkostad/Programmi/EthBMC-master/esvm)
warning: unnecessary braces around block return value
--> esvm/src/se/env.rs:18:9
|
18 | { Mutex::new(HashMap::new()) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove these braces
|
= note: #[warn(unused_braces)] on by default

warning: unnecessary parentheses around type
--> esvm/src/se/symbolic_state.rs:551:38
|
551 | pub fn pop1(&mut self) -> Option<(BVal)> {
| ^^^^^^ help: remove these parentheses
|
= note: #[warn(unused_parens)] on by default

warning: unnecessary braces around block return value
--> esvm/src/se/symbolic_state.rs:742:62
|
742 | static ref SAT_CACHE: RwLock<HashMap<Vec, bool>> = { RwLock::new(HashMap::new()) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove these braces

warning: use of deprecated associated function std::error::Error::description: use the Display impl or to_string()
--> esvm/src/se/expr/z3.rs:58:61
|
58 | Err(why) => panic!("couldn't spawn z3: {}", why.description()),
| ^^^^^^^^^^^
|
= note: #[warn(deprecated)] on by default

warning: cannot borrow res as mutable because it is also borrowed as immutable
--> esvm/src/se/symbolic_executor/stack_ops.rs:55:25
|
43 | &res.env.blockhashes,
| ------- immutable borrow occurs here
...
55 | res.push(Arc::clone(hash));
| ^^^ ---- immutable borrow later used here
| |
| mutable borrow occurs here
|
= note: #[warn(mutable_borrow_reservation_conflict)] on by default
= warning: this borrowing pattern was not meant to be accepted, and may become a hard error in the future
= note: for more information, see issue #59159 rust-lang/rust#59159

warning: 5 warnings emitted

-------------------------------------------------------------- 5 ---------------------------------------------------------
Compiling contracts v0.1.0 (/home/mirkostad/Programmi/EthBMC-master/esvm/contracts)
warning: unused Result that must be used
--> esvm/src/main.rs:25:5
|
25 | fs::create_dir_all("log");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: #[warn(unused_must_use)] on by default
= note: this Result may be an Err variant, which should be handled

warning: 1 warning emitted

Then I tried to execute
$ ./target/release/ethbmc examples/rubixi/rubixi.yml
I receive the output in the attachment.
Do you have any suggestion?
Thanks in advance
rubixi_error.txt

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.