Don't erase things for BMC if function call is staticcall

This commit is contained in:
Leo Alt 2021-08-25 14:09:46 +02:00
parent a55685c04f
commit 718f392849
5 changed files with 55 additions and 0 deletions

View File

@ -587,6 +587,11 @@ void BMC::internalOrExternalFunctionCall(FunctionCall const& _funCall)
_funCall.location(),
"BMC does not yet implement this type of function call."
);
else if (funType.kind() == FunctionType::Kind::BareStaticCall)
{
// Do nothing here.
// Neither storage nor balances should be modified.
}
else
{
m_externalFunctionCallHappened = true;

View File

@ -0,0 +1,13 @@
contract C {
function f(address _a) public {
uint b1 = address(this).balance;
_a.call("");
uint b2 = address(this).balance;
assert(b1 == b2); // should fail
}
}
// ====
// SMTEngine: bmc
// ----
// Warning 9302: (83-94): Return value of low-level calls not used.
// Warning 4661: (133-149): BMC: Assertion violation happens here.

View File

@ -0,0 +1,13 @@
contract C {
uint x;
function f(address _a) public {
x = 2;
_a.call("");
assert(x == 2); // should fail
}
}
// ====
// SMTEngine: bmc
// ----
// Warning 9302: (66-77): Return value of low-level calls not used.
// Warning 4661: (81-95): BMC: Assertion violation happens here.

View File

@ -0,0 +1,12 @@
contract C {
function f(address _a) public view {
uint b1 = address(this).balance;
_a.staticcall("");
uint b2 = address(this).balance;
assert(b1 == b2); // should hold
}
}
// ====
// SMTEngine: bmc
// ----
// Warning 9302: (88-105): Return value of low-level calls not used.

View File

@ -0,0 +1,12 @@
contract C {
uint x;
function f(address _a) public {
x = 2;
_a.staticcall("");
assert(x == 2); // should hold
}
}
// ====
// SMTEngine: bmc
// ----
// Warning 9302: (66-83): Return value of low-level calls not used.