[SMTChecker] Fix super and virtual

This commit is contained in:
Leonardo Alt
2021-01-28 18:51:29 +01:00
parent d753c1a047
commit 545305a31f
18 changed files with 430 additions and 59 deletions
@@ -20,9 +20,9 @@ contract Der is Base {
// ====
// SMTIgnoreCex: yes
// ----
// Warning 4984: (base:100-103): CHC: Overflow (resulting value larger than 2**256 - 1) might happen here.
// Warning 4984: (der:101-109): CHC: Overflow (resulting value larger than 2**256 - 1) might happen here.
// Warning 6328: (der:113-126): CHC: Assertion violation happens here.
// Warning 4984: (base:100-103): CHC: Overflow (resulting value larger than 2**256 - 1) might happen here.
// Warning 2661: (base:100-103): BMC: Overflow (resulting value larger than 2**256 - 1) happens here.
// Warning 2661: (base:100-103): BMC: Overflow (resulting value larger than 2**256 - 1) happens here.
// Warning 2661: (der:101-109): BMC: Overflow (resulting value larger than 2**256 - 1) happens here.
// Warning 2661: (base:100-103): BMC: Overflow (resulting value larger than 2**256 - 1) happens here.
@@ -0,0 +1,31 @@
pragma experimental SMTChecker;
contract A {
uint x;
function f() internal virtual {
v();
assert(x == 0); // should fail
assert(x == 2); // should hold
}
function v() internal virtual {
x = 0;
}
}
contract B is A {
function f() internal virtual override {
super.f();
}
}
contract C is B {
function g() public {
x = 1;
f();
}
function v() internal override {
x = 2;
}
}
// ----
// Warning 6328: (97-111): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nC.constructor()\nState: x = 0\nC.g()\n B.f() -- internal call\n A.f() -- internal call\n C.v() -- internal call
@@ -0,0 +1,38 @@
pragma experimental SMTChecker;
contract A {
uint x;
function f() internal virtual {
v();
assert(x == 0); // should fail
assert(x == 2); // should hold
}
function v() internal virtual {
x = 0;
}
}
contract A1 is A {
function f() internal virtual override {
super.f();
}
}
contract B is A {
function f() internal virtual override {
super.f();
}
}
contract C is B, A1 {
function g() public {
x = 1;
f();
}
function f() internal override(B, A1) {
super.f();
}
function v() internal override {
x = 2;
}
}
// ----
// Warning 6328: (97-111): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nC.constructor()\nState: x = 0\nC.g()\n C.f() -- internal call\n A1.f() -- internal call\n B.f() -- internal call\n A.f() -- internal call\n C.v() -- internal call
@@ -0,0 +1,32 @@
pragma experimental SMTChecker;
contract A {
uint x;
function f() internal virtual {
v();
assert(x == 0); // should hold
assert(x == 2); // should fail
}
function v() internal virtual {
x = 0;
}
}
contract B is A {
function f() internal virtual override {
super.f();
}
}
contract C is B {
function g() public {
x = 1;
f();
}
function v() internal override {
x = 2;
super.v();
}
}
// ----
// Warning 6328: (130-144): CHC: Assertion violation happens here.\nCounterexample:\nx = 0\n\nTransaction trace:\nC.constructor()\nState: x = 0\nC.g()\n B.f() -- internal call\n A.f() -- internal call\n C.v() -- internal call\n A.v() -- internal call
@@ -0,0 +1,34 @@
pragma experimental SMTChecker;
contract A {
uint x;
function f() internal virtual {
v();
assert(x == 2); // should hold
}
function v() internal virtual {
x = 0;
}
function g() public virtual {
v();
assert(x == 2); // should fail
}
}
contract B is A {
function f() internal virtual override {
super.f();
}
}
contract C is B {
function g() public override {
x = 1;
f();
}
function v() internal override {
x = 2;
}
}
// ----
// Warning 6328: (216-230): CHC: Assertion violation happens here.\nCounterexample:\nx = 0\n\nTransaction trace:\nA.constructor()\nState: x = 0\nA.g()\n A.v() -- internal call
@@ -0,0 +1,25 @@
pragma experimental SMTChecker;
contract A {
uint x;
function f() internal {
v();
assert(x == 0); // should fail
assert(x == 2); // should hold
}
function v() internal virtual {
x = 0;
}
}
contract C is A {
function g() public {
x = 1;
f();
}
function v() internal override {
x = 2;
}
}
// ----
// Warning 6328: (89-103): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nC.constructor()\nState: x = 0\nC.g()\n A.f() -- internal call\n C.v() -- internal call
@@ -0,0 +1,18 @@
pragma experimental SMTChecker;
abstract contract A {
uint x;
function f() public view {
assert(x == 2);
}
}
contract C is A {
function g() public {
x = 2;
f();
x = 0;
}
}
// ----
// Warning 6328: (94-108): CHC: Assertion violation happens here.\nCounterexample:\nx = 0\n\nTransaction trace:\nA.constructor()\nState: x = 0\nA.f()
@@ -0,0 +1,32 @@
pragma experimental SMTChecker;
contract A {
uint x;
function f() public virtual {
v();
assert(x == 0); // should fail when C is the most derived contract
assert(x == 2); // should fail when A is the most derived contract
}
function v() internal virtual {
x = 0;
}
}
contract B is A {
function f() public virtual override {
super.f();
}
}
contract C is B {
function g() public {
x = 1;
f();
}
function v() internal override {
x = 2;
}
}
// ----
// Warning 6328: (164-178): CHC: Assertion violation happens here.\nCounterexample:\nx = 0\n\nTransaction trace:\nA.constructor()\nState: x = 0\nA.f()\n A.v() -- internal call
// Warning 6328: (95-109): CHC: Assertion violation happens here.\nCounterexample:\nx = 2\n\nTransaction trace:\nC.constructor()\nState: x = 0\nB.f()\n A.f() -- internal call\n C.v() -- internal call
@@ -0,0 +1,31 @@
pragma experimental SMTChecker;
contract A {
function f() public virtual returns (uint256 r) {
return 1;
}
}
contract B is A {
function f() public virtual override returns (uint256 r) {
return super.f() + 2;
}
}
contract C is A {
function f() public virtual override returns (uint256 r) {
return super.f() + 4;
}
}
contract D is B, C {
function f() public override(B, C) returns (uint256 r) {
r = super.f() + 8;
assert(r == 15); // should hold
assert(r == 13); // should fail
}
}
// ----
// Warning 6328: (469-484): CHC: Assertion violation happens here.\nCounterexample:\n\nr = 15\n\nTransaction trace:\nD.constructor()\nD.f()\n C.f() -- internal call\n B.f() -- internal call\n A.f() -- internal call
@@ -0,0 +1,33 @@
pragma experimental SMTChecker;
contract A {
function f() public virtual returns (uint256 r) {
return 1;
}
}
contract B is A {
function f() public virtual override returns (uint256 r) {
return super.f() + 2;
}
}
contract C is A {
function f() public virtual override returns (uint256 r) {
return 2 * (super.f() + 4);
}
}
contract D is B, C {
function f() public override(B, C) returns (uint256 r) {
r = super.f() + 8;
assert(r == 22); // should hold
assert(r == 20); // should fail
assert(r == 18); // should fail
}
}
// ----
// Warning 6328: (475-490): CHC: Assertion violation happens here.\nCounterexample:\n\nr = 22\n\nTransaction trace:\nD.constructor()\nD.f()\n C.f() -- internal call\n B.f() -- internal call\n A.f() -- internal call
// Warning 6328: (509-524): CHC: Assertion violation happens here.\nCounterexample:\n\nr = 22\n\nTransaction trace:\nD.constructor()\nD.f()\n C.f() -- internal call\n B.f() -- internal call\n A.f() -- internal call
@@ -0,0 +1,35 @@
pragma experimental SMTChecker;
contract A {
int public x;
function f() public virtual {
x = 1;
}
}
contract B is A {
function f() public virtual override {
super.f();
x += 100;
}
}
contract C is B {
function f() public virtual override {
super.f();
x += 10;
}
}
contract D is B {
}
contract E is C,D {
function f() public override(C,B) {
super.f();
assert(x == 111); // should hold
assert(x == 13); // should fail
}
}
// ----
// Warning 6328: (412-427): CHC: Assertion violation happens here.\nCounterexample:\nx = 111\n\nTransaction trace:\nE.constructor()\nState: x = 0\nE.f()\n C.f() -- internal call\n B.f() -- internal call\n A.f() -- internal call