mirror of https://github.com/crytic/slither
commit
fe2b0cacf1
@ -0,0 +1,60 @@ |
||||
from typing import List |
||||
from slither.core.cfg.node import Node |
||||
from slither.core.declarations import Function, SolidityVariable |
||||
from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification |
||||
from slither.slithir.operations.high_level_call import HighLevelCall |
||||
|
||||
|
||||
class VarReadUsingThis(AbstractDetector): |
||||
ARGUMENT = "var-read-using-this" |
||||
HELP = "Contract reads its own variable using `this`" |
||||
IMPACT = DetectorClassification.OPTIMIZATION |
||||
CONFIDENCE = DetectorClassification.HIGH |
||||
|
||||
WIKI = "https://github.com/crytic/slither/wiki/Vulnerabilities-Description#public-variable-read-in-external-context" |
||||
|
||||
WIKI_TITLE = "Public variable read in external context" |
||||
WIKI_DESCRIPTION = "The contract reads its own variable using `this`, adding overhead of an unnecessary STATICCALL." |
||||
WIKI_EXPLOIT_SCENARIO = """ |
||||
```solidity |
||||
contract C { |
||||
mapping(uint => address) public myMap; |
||||
function test(uint x) external returns(address) { |
||||
return this.myMap(x); |
||||
} |
||||
} |
||||
``` |
||||
""" |
||||
|
||||
WIKI_RECOMMENDATION = "Read the variable directly from storage instead of calling the contract." |
||||
|
||||
def _detect(self): |
||||
results = [] |
||||
for c in self.contracts: |
||||
for func in c.functions: |
||||
for node in self._detect_var_read_using_this(func): |
||||
info = [ |
||||
"The function ", |
||||
func, |
||||
" reads ", |
||||
node, |
||||
" with `this` which adds an extra STATICCALL.\n", |
||||
] |
||||
json = self.generate_result(info) |
||||
results.append(json) |
||||
|
||||
return results |
||||
|
||||
@staticmethod |
||||
def _detect_var_read_using_this(func: Function) -> List[Node]: |
||||
results: List[Node] = [] |
||||
for node in func.nodes: |
||||
for ir in node.irs: |
||||
if isinstance(ir, HighLevelCall): |
||||
if ( |
||||
ir.destination == SolidityVariable("this") |
||||
and ir.is_static_call() |
||||
and ir.function.visibility == "public" |
||||
): |
||||
results.append(node) |
||||
return sorted(results, key=lambda x: x.node_id) |
@ -1,27 +0,0 @@ |
||||
from slither.core.declarations import Function |
||||
from slither.slithir.operations.lvalue import OperationWithLValue |
||||
from slither.slithir.utils.utils import is_valid_lvalue, is_valid_rvalue |
||||
|
||||
|
||||
class Push(OperationWithLValue): |
||||
def __init__(self, array, value): |
||||
super().__init__() |
||||
assert is_valid_rvalue(value) or isinstance(value, Function) |
||||
assert is_valid_lvalue(array) |
||||
self._value = value |
||||
self._lvalue = array |
||||
|
||||
@property |
||||
def read(self): |
||||
return [self._value] |
||||
|
||||
@property |
||||
def array(self): |
||||
return self._lvalue |
||||
|
||||
@property |
||||
def value(self): |
||||
return self._value |
||||
|
||||
def __str__(self): |
||||
return f"PUSH {self.value} in {self.lvalue}" |
Binary file not shown.
@ -0,0 +1,3 @@ |
||||
{ |
||||
"BaseContract": {} |
||||
} |
@ -0,0 +1,18 @@ |
||||
struct my_struct { |
||||
uint[][] a; // works fine |
||||
uint[][3] b; // works fine |
||||
uint[3][] c; // fails |
||||
uint[3][3] d; // fails |
||||
uint[2**20] e; // works fine |
||||
} |
||||
contract BaseContract{ |
||||
struct my_struct_2 { |
||||
uint[][] f; // works fine |
||||
uint[][3] g; // works fine |
||||
uint[3][] h; // works fine |
||||
uint[3][3] i; // works fine |
||||
uint[2**20] j; // works fine |
||||
} |
||||
|
||||
uint[3][] k; // works fine |
||||
} |
@ -0,0 +1,16 @@ |
||||
/// @custom:security isDelegatecallProxy |
||||
contract Proxy{ |
||||
|
||||
} |
||||
|
||||
/// @custom:security isUpgradeable |
||||
/// @custom:version name=version-0 |
||||
contract V0{ |
||||
|
||||
} |
||||
|
||||
/// @custom:security isUpgradeable |
||||
/// @custom:version name=version_1 |
||||
contract V1{ |
||||
|
||||
} |
@ -0,0 +1,33 @@ |
||||
|
||||
contract VarReadUsingThis { |
||||
address public erc20; |
||||
mapping(uint => address) public myMap; |
||||
function bad1(uint x) external returns(address) { |
||||
return this.myMap(x); |
||||
} |
||||
function bad2() external returns(address) { |
||||
return this.erc20(); |
||||
} |
||||
function bad3() external returns(address) { |
||||
if (this.erc20() == address(0)) revert(); |
||||
} |
||||
function bad4() internal returns(address) { |
||||
for (uint x; x < 10; x++) { |
||||
address local = this.erc20(); |
||||
} |
||||
} |
||||
function good1(uint x) external returns(address) { |
||||
return myMap[x]; |
||||
} |
||||
function good2() external returns(address) { |
||||
return erc20; |
||||
} |
||||
function good3() external returns(address) { |
||||
if (erc20 == address(0)) revert(); |
||||
} |
||||
function good4() internal returns(address) { |
||||
for (uint x; x < 10; x++) { |
||||
address local = erc20; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,3 @@ |
||||
[ |
||||
[] |
||||
] |
@ -0,0 +1,39 @@ |
||||
|
||||
contract VarReadUsingThis { |
||||
address public erc20; |
||||
mapping(uint => address) public myMap; |
||||
function bad1(uint x) external returns(address) { |
||||
return this.myMap(x); |
||||
} |
||||
function bad2() external returns(address) { |
||||
return this.erc20(); |
||||
} |
||||
function bad3() external returns(address) { |
||||
if (this.erc20() == address(0)) revert(); |
||||
} |
||||
function bad4() internal returns(address) { |
||||
for (uint x; x < 10; x++) { |
||||
address local = this.erc20(); |
||||
} |
||||
} |
||||
function good1(uint x) external returns(address) { |
||||
return myMap[x]; |
||||
} |
||||
function good2() external returns(address) { |
||||
return erc20; |
||||
} |
||||
function good3() external returns(address) { |
||||
if (erc20 == address(0)) revert(); |
||||
} |
||||
function good4() internal returns(address) { |
||||
for (uint x; x < 10; x++) { |
||||
address local = erc20; |
||||
} |
||||
} |
||||
function mapExternal(uint x) external view returns(address) { |
||||
return myMap[x]; |
||||
} |
||||
function good5(uint x) external returns(address) { |
||||
this.mapExternal(x); |
||||
} |
||||
} |
@ -0,0 +1,736 @@ |
||||
[ |
||||
[ |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad3", |
||||
"source_mapping": { |
||||
"start": 275, |
||||
"length": 99, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
11, |
||||
12, |
||||
13 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1107, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad3()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.erc20() == address(0)", |
||||
"source_mapping": { |
||||
"start": 331, |
||||
"length": 26, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
12 |
||||
], |
||||
"starting_column": 13, |
||||
"ending_column": 39 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad3", |
||||
"source_mapping": { |
||||
"start": 275, |
||||
"length": 99, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
11, |
||||
12, |
||||
13 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1107, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad3()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad3() (tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#11-13) reads this.erc20() == address(0) (tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#12) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad3()](tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L11-L13) reads [this.erc20() == address(0)](tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L12) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L11-L13", |
||||
"id": "5556888563fa21301c242d57fbd8e08a35fc5d67171a88b9a2737c14be9c6f7f", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad2", |
||||
"source_mapping": { |
||||
"start": 192, |
||||
"length": 78, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
8, |
||||
9, |
||||
10 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1107, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad2()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.erc20()", |
||||
"source_mapping": { |
||||
"start": 244, |
||||
"length": 19, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
9 |
||||
], |
||||
"starting_column": 9, |
||||
"ending_column": 28 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad2", |
||||
"source_mapping": { |
||||
"start": 192, |
||||
"length": 78, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
8, |
||||
9, |
||||
10 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1107, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad2()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad2() (tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#8-10) reads this.erc20() (tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#9) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad2()](tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L8-L10) reads [this.erc20()](tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L9) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L8-L10", |
||||
"id": "a55229af8750117389299ed9f759d5036882a2396a52087bb2a42c5ed8abaec1", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad1", |
||||
"source_mapping": { |
||||
"start": 102, |
||||
"length": 85, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
5, |
||||
6, |
||||
7 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1107, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad1(uint256)" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.myMap(x)", |
||||
"source_mapping": { |
||||
"start": 160, |
||||
"length": 20, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
6 |
||||
], |
||||
"starting_column": 9, |
||||
"ending_column": 29 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad1", |
||||
"source_mapping": { |
||||
"start": 102, |
||||
"length": 85, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
5, |
||||
6, |
||||
7 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1107, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad1(uint256)" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad1(uint256) (tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#5-7) reads this.myMap(x) (tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#6) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad1(uint256)](tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L5-L7) reads [this.myMap(x)](tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L6) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L5-L7", |
||||
"id": "e810f17bcfdf391a48e66ef70c4aafcc205c882b28d0588b26f1d45742580df6", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad4", |
||||
"source_mapping": { |
||||
"start": 379, |
||||
"length": 138, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1107, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad4()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "local = this.erc20()", |
||||
"source_mapping": { |
||||
"start": 471, |
||||
"length": 28, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
16 |
||||
], |
||||
"starting_column": 13, |
||||
"ending_column": 41 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad4", |
||||
"source_mapping": { |
||||
"start": 379, |
||||
"length": 138, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1107, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad4()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad4() (tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#14-18) reads local = this.erc20() (tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#16) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad4()](tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L14-L18) reads [local = this.erc20()](tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L16) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol#L14-L18", |
||||
"id": "fe997df3fdea17b13139a239ecdcdb64a2f6482aa9dacc62f845ef30591c8e4c", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
} |
||||
] |
||||
] |
@ -0,0 +1,39 @@ |
||||
|
||||
contract VarReadUsingThis { |
||||
address public erc20; |
||||
mapping(uint => address) public myMap; |
||||
function bad1(uint x) external returns(address) { |
||||
return this.myMap(x); |
||||
} |
||||
function bad2() external returns(address) { |
||||
return this.erc20(); |
||||
} |
||||
function bad3() external returns(address) { |
||||
if (this.erc20() == address(0)) revert(); |
||||
} |
||||
function bad4() internal returns(address) { |
||||
for (uint x; x < 10; x++) { |
||||
address local = this.erc20(); |
||||
} |
||||
} |
||||
function good1(uint x) external returns(address) { |
||||
return myMap[x]; |
||||
} |
||||
function good2() external returns(address) { |
||||
return erc20; |
||||
} |
||||
function good3() external returns(address) { |
||||
if (erc20 == address(0)) revert(); |
||||
} |
||||
function good4() internal returns(address) { |
||||
for (uint x; x < 10; x++) { |
||||
address local = erc20; |
||||
} |
||||
} |
||||
function mapExternal(uint x) external view returns(address) { |
||||
return myMap[x]; |
||||
} |
||||
function good5(uint x) external returns(address) { |
||||
this.mapExternal(x); |
||||
} |
||||
} |
@ -0,0 +1,736 @@ |
||||
[ |
||||
[ |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad3", |
||||
"source_mapping": { |
||||
"start": 275, |
||||
"length": 99, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
11, |
||||
12, |
||||
13 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad3()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.erc20() == address(0)", |
||||
"source_mapping": { |
||||
"start": 331, |
||||
"length": 26, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
12 |
||||
], |
||||
"starting_column": 13, |
||||
"ending_column": 39 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad3", |
||||
"source_mapping": { |
||||
"start": 275, |
||||
"length": 99, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
11, |
||||
12, |
||||
13 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad3()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad3() (tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#11-13) reads this.erc20() == address(0) (tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#12) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad3()](tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L11-L13) reads [this.erc20() == address(0)](tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L12) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L11-L13", |
||||
"id": "314f90a4989ea75cc274e1f5f46036968c2ecdaaf8fa84913e7db4ef1ffe5bb8", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad4", |
||||
"source_mapping": { |
||||
"start": 379, |
||||
"length": 138, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad4()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "local = this.erc20()", |
||||
"source_mapping": { |
||||
"start": 471, |
||||
"length": 28, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
16 |
||||
], |
||||
"starting_column": 13, |
||||
"ending_column": 41 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad4", |
||||
"source_mapping": { |
||||
"start": 379, |
||||
"length": 138, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad4()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad4() (tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#14-18) reads local = this.erc20() (tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#16) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad4()](tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L14-L18) reads [local = this.erc20()](tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L16) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L14-L18", |
||||
"id": "5fd3f1f78f3532107d7e111d84310f3a0fa374fa407e43951d70fd00a752f76f", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad1", |
||||
"source_mapping": { |
||||
"start": 102, |
||||
"length": 85, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
5, |
||||
6, |
||||
7 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad1(uint256)" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.myMap(x)", |
||||
"source_mapping": { |
||||
"start": 160, |
||||
"length": 20, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
6 |
||||
], |
||||
"starting_column": 9, |
||||
"ending_column": 29 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad1", |
||||
"source_mapping": { |
||||
"start": 102, |
||||
"length": 85, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
5, |
||||
6, |
||||
7 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad1(uint256)" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad1(uint256) (tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#5-7) reads this.myMap(x) (tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#6) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad1(uint256)](tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L5-L7) reads [this.myMap(x)](tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L6) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L5-L7", |
||||
"id": "a30c3d8ddb468d865fa69afe5b7b83164fc1a332933d4661765cc3781896c7cf", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad2", |
||||
"source_mapping": { |
||||
"start": 192, |
||||
"length": 78, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
8, |
||||
9, |
||||
10 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad2()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.erc20()", |
||||
"source_mapping": { |
||||
"start": 244, |
||||
"length": 19, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
9 |
||||
], |
||||
"starting_column": 9, |
||||
"ending_column": 28 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad2", |
||||
"source_mapping": { |
||||
"start": 192, |
||||
"length": 78, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
8, |
||||
9, |
||||
10 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad2()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad2() (tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#8-10) reads this.erc20() (tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#9) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad2()](tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L8-L10) reads [this.erc20()](tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L9) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol#L8-L10", |
||||
"id": "ccc77ba655d341c0461ca4f4040afe19c379b2333e52648b12f793aaf7f0ead8", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
} |
||||
] |
||||
] |
@ -0,0 +1,39 @@ |
||||
|
||||
contract VarReadUsingThis { |
||||
address public erc20; |
||||
mapping(uint => address) public myMap; |
||||
function bad1(uint x) external returns(address) { |
||||
return this.myMap(x); |
||||
} |
||||
function bad2() external returns(address) { |
||||
return this.erc20(); |
||||
} |
||||
function bad3() external returns(address) { |
||||
if (this.erc20() == address(0)) revert(); |
||||
} |
||||
function bad4() internal returns(address) { |
||||
for (uint x; x < 10; x++) { |
||||
address local = this.erc20(); |
||||
} |
||||
} |
||||
function good1(uint x) external returns(address) { |
||||
return myMap[x]; |
||||
} |
||||
function good2() external returns(address) { |
||||
return erc20; |
||||
} |
||||
function good3() external returns(address) { |
||||
if (erc20 == address(0)) revert(); |
||||
} |
||||
function good4() internal returns(address) { |
||||
for (uint x; x < 10; x++) { |
||||
address local = erc20; |
||||
} |
||||
} |
||||
function mapExternal(uint x) external view returns(address) { |
||||
return myMap[x]; |
||||
} |
||||
function good5(uint x) external returns(address) { |
||||
this.mapExternal(x); |
||||
} |
||||
} |
@ -0,0 +1,736 @@ |
||||
[ |
||||
[ |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad3", |
||||
"source_mapping": { |
||||
"start": 275, |
||||
"length": 99, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
11, |
||||
12, |
||||
13 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad3()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.erc20() == address(0)", |
||||
"source_mapping": { |
||||
"start": 331, |
||||
"length": 26, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
12 |
||||
], |
||||
"starting_column": 13, |
||||
"ending_column": 39 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad3", |
||||
"source_mapping": { |
||||
"start": 275, |
||||
"length": 99, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
11, |
||||
12, |
||||
13 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad3()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad3() (tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#11-13) reads this.erc20() == address(0) (tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#12) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad3()](tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L11-L13) reads [this.erc20() == address(0)](tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L12) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L11-L13", |
||||
"id": "1a8ed403cb8c6104a99c9dabdfb64e55282eaedf2c2d8b20fd3b366c49443639", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad2", |
||||
"source_mapping": { |
||||
"start": 192, |
||||
"length": 78, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
8, |
||||
9, |
||||
10 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad2()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.erc20()", |
||||
"source_mapping": { |
||||
"start": 244, |
||||
"length": 19, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
9 |
||||
], |
||||
"starting_column": 9, |
||||
"ending_column": 28 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad2", |
||||
"source_mapping": { |
||||
"start": 192, |
||||
"length": 78, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
8, |
||||
9, |
||||
10 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad2()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad2() (tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#8-10) reads this.erc20() (tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#9) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad2()](tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L8-L10) reads [this.erc20()](tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L9) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L8-L10", |
||||
"id": "5bddf45a7f968094e163217be36e0cf17b7455740755eec53a1e7b0a44fe63ac", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad1", |
||||
"source_mapping": { |
||||
"start": 102, |
||||
"length": 85, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
5, |
||||
6, |
||||
7 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad1(uint256)" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.myMap(x)", |
||||
"source_mapping": { |
||||
"start": 160, |
||||
"length": 20, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
6 |
||||
], |
||||
"starting_column": 9, |
||||
"ending_column": 29 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad1", |
||||
"source_mapping": { |
||||
"start": 102, |
||||
"length": 85, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
5, |
||||
6, |
||||
7 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad1(uint256)" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad1(uint256) (tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#5-7) reads this.myMap(x) (tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#6) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad1(uint256)](tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L5-L7) reads [this.myMap(x)](tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L6) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L5-L7", |
||||
"id": "924c227bf74e70dda261578563193b90b60b70a1ad043716e1d98cbc49b87ceb", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad4", |
||||
"source_mapping": { |
||||
"start": 379, |
||||
"length": 138, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad4()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "local = this.erc20()", |
||||
"source_mapping": { |
||||
"start": 471, |
||||
"length": 28, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
16 |
||||
], |
||||
"starting_column": 13, |
||||
"ending_column": 41 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad4", |
||||
"source_mapping": { |
||||
"start": 379, |
||||
"length": 138, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad4()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad4() (tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#14-18) reads local = this.erc20() (tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#16) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad4()](tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L14-L18) reads [local = this.erc20()](tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L16) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol#L14-L18", |
||||
"id": "e9b34de7b565a0e63e55b9c74eaf9a265c7f4c8ef866d7b7db17b815393f0477", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
} |
||||
] |
||||
] |
@ -0,0 +1,39 @@ |
||||
|
||||
contract VarReadUsingThis { |
||||
address public erc20; |
||||
mapping(uint => address) public myMap; |
||||
function bad1(uint x) external returns(address) { |
||||
return this.myMap(x); |
||||
} |
||||
function bad2() external returns(address) { |
||||
return this.erc20(); |
||||
} |
||||
function bad3() external returns(address) { |
||||
if (this.erc20() == address(0)) revert(); |
||||
} |
||||
function bad4() internal returns(address) { |
||||
for (uint x; x < 10; x++) { |
||||
address local = this.erc20(); |
||||
} |
||||
} |
||||
function good1(uint x) external returns(address) { |
||||
return myMap[x]; |
||||
} |
||||
function good2() external returns(address) { |
||||
return erc20; |
||||
} |
||||
function good3() external returns(address) { |
||||
if (erc20 == address(0)) revert(); |
||||
} |
||||
function good4() internal returns(address) { |
||||
for (uint x; x < 10; x++) { |
||||
address local = erc20; |
||||
} |
||||
} |
||||
function mapExternal(uint x) external view returns(address) { |
||||
return myMap[x]; |
||||
} |
||||
function good5(uint x) external returns(address) { |
||||
this.mapExternal(x); |
||||
} |
||||
} |
@ -0,0 +1,736 @@ |
||||
[ |
||||
[ |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad2", |
||||
"source_mapping": { |
||||
"start": 192, |
||||
"length": 78, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
8, |
||||
9, |
||||
10 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad2()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.erc20()", |
||||
"source_mapping": { |
||||
"start": 244, |
||||
"length": 19, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
9 |
||||
], |
||||
"starting_column": 9, |
||||
"ending_column": 28 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad2", |
||||
"source_mapping": { |
||||
"start": 192, |
||||
"length": 78, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
8, |
||||
9, |
||||
10 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad2()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad2() (tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#8-10) reads this.erc20() (tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#9) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad2()](tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L8-L10) reads [this.erc20()](tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L9) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L8-L10", |
||||
"id": "4e297ea309b8865f782db6a53fdaf5aaf37f768158deb69d2ec6106a8e7b8afd", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad1", |
||||
"source_mapping": { |
||||
"start": 102, |
||||
"length": 85, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
5, |
||||
6, |
||||
7 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad1(uint256)" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.myMap(x)", |
||||
"source_mapping": { |
||||
"start": 160, |
||||
"length": 20, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
6 |
||||
], |
||||
"starting_column": 9, |
||||
"ending_column": 29 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad1", |
||||
"source_mapping": { |
||||
"start": 102, |
||||
"length": 85, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
5, |
||||
6, |
||||
7 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad1(uint256)" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad1(uint256) (tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#5-7) reads this.myMap(x) (tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#6) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad1(uint256)](tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L5-L7) reads [this.myMap(x)](tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L6) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L5-L7", |
||||
"id": "ce4d740b2da0b9b71f2dd3dd1c0903124f7be34009ede12a43dc33c6f28b9d28", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad3", |
||||
"source_mapping": { |
||||
"start": 275, |
||||
"length": 99, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
11, |
||||
12, |
||||
13 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad3()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "this.erc20() == address(0)", |
||||
"source_mapping": { |
||||
"start": 331, |
||||
"length": 26, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
12 |
||||
], |
||||
"starting_column": 13, |
||||
"ending_column": 39 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad3", |
||||
"source_mapping": { |
||||
"start": 275, |
||||
"length": 99, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
11, |
||||
12, |
||||
13 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad3()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad3() (tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#11-13) reads this.erc20() == address(0) (tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#12) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad3()](tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L11-L13) reads [this.erc20() == address(0)](tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L12) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L11-L13", |
||||
"id": "d4602ee9be1e60f8ae80e6d0a867b532cb2ddef0ba44b25af8808a0ac5a6b828", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
}, |
||||
{ |
||||
"elements": [ |
||||
{ |
||||
"type": "function", |
||||
"name": "bad4", |
||||
"source_mapping": { |
||||
"start": 379, |
||||
"length": 138, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad4()" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "node", |
||||
"name": "local = this.erc20()", |
||||
"source_mapping": { |
||||
"start": 471, |
||||
"length": 28, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
16 |
||||
], |
||||
"starting_column": 13, |
||||
"ending_column": 41 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "function", |
||||
"name": "bad4", |
||||
"source_mapping": { |
||||
"start": 379, |
||||
"length": 138, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18 |
||||
], |
||||
"starting_column": 5, |
||||
"ending_column": 6 |
||||
}, |
||||
"type_specific_fields": { |
||||
"parent": { |
||||
"type": "contract", |
||||
"name": "VarReadUsingThis", |
||||
"source_mapping": { |
||||
"start": 1, |
||||
"length": 1103, |
||||
"filename_relative": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"filename_absolute": "/GENERIC_PATH", |
||||
"filename_short": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol", |
||||
"is_dependency": false, |
||||
"lines": [ |
||||
2, |
||||
3, |
||||
4, |
||||
5, |
||||
6, |
||||
7, |
||||
8, |
||||
9, |
||||
10, |
||||
11, |
||||
12, |
||||
13, |
||||
14, |
||||
15, |
||||
16, |
||||
17, |
||||
18, |
||||
19, |
||||
20, |
||||
21, |
||||
22, |
||||
23, |
||||
24, |
||||
25, |
||||
26, |
||||
27, |
||||
28, |
||||
29, |
||||
30, |
||||
31, |
||||
32, |
||||
33, |
||||
34, |
||||
35, |
||||
36, |
||||
37, |
||||
38, |
||||
39 |
||||
], |
||||
"starting_column": 1, |
||||
"ending_column": 2 |
||||
} |
||||
}, |
||||
"signature": "bad4()" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"description": "The function VarReadUsingThis.bad4() (tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#14-18) reads local = this.erc20() (tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#16) with `this` which adds an extra STATICCALL.\n", |
||||
"markdown": "The function [VarReadUsingThis.bad4()](tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L14-L18) reads [local = this.erc20()](tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L16) with `this` which adds an extra STATICCALL.\n", |
||||
"first_markdown_element": "tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol#L14-L18", |
||||
"id": "fec10ba084a6322d0fbb895e6c7ca6bca380b48a54d2ecae92a017b8b41242bf", |
||||
"check": "var-read-using-this", |
||||
"impact": "Optimization", |
||||
"confidence": "High" |
||||
} |
||||
] |
||||
] |
@ -0,0 +1,6 @@ |
||||
[profile.default] |
||||
src = 'src' |
||||
out = 'out' |
||||
libs = ['lib'] |
||||
|
||||
# See more config options https://github.com/foundry-rs/foundry/tree/master/config |
@ -0,0 +1 @@ |
||||
Subproject commit eb980e1d4f0e8173ec27da77297ae411840c8ccb |
@ -0,0 +1,12 @@ |
||||
// SPDX-License-Identifier: UNLICENSED |
||||
pragma solidity ^0.8.13; |
||||
|
||||
import "forge-std/Script.sol"; |
||||
|
||||
contract CounterScript is Script { |
||||
function setUp() public {} |
||||
|
||||
function run() public { |
||||
vm.broadcast(); |
||||
} |
||||
} |
@ -0,0 +1,14 @@ |
||||
// SPDX-License-Identifier: UNLICENSED |
||||
pragma solidity ^0.8.13; |
||||
|
||||
contract Counter { |
||||
uint256 public number; |
||||
|
||||
function setNumber(uint256 newNumber) public { |
||||
number = newNumber; |
||||
} |
||||
|
||||
function increment() public { |
||||
number++; |
||||
} |
||||
} |
@ -0,0 +1,5 @@ |
||||
// SPDX-License-Identifier: UNLICENSED |
||||
pragma solidity ^0.8.13; |
||||
|
||||
contract Counter { |
||||
} |
@ -0,0 +1,24 @@ |
||||
// SPDX-License-Identifier: UNLICENSED |
||||
pragma solidity ^0.8.13; |
||||
|
||||
import "forge-std/Test.sol"; |
||||
import "../src/Counter.sol"; |
||||
|
||||
contract CounterTest is Test { |
||||
Counter public counter; |
||||
|
||||
function setUp() public { |
||||
counter = new Counter(); |
||||
counter.setNumber(0); |
||||
} |
||||
|
||||
function testIncrement() public { |
||||
counter.increment(); |
||||
assertEq(counter.number(), 1); |
||||
} |
||||
|
||||
function testSetNumber(uint256 x) public { |
||||
counter.setNumber(x); |
||||
assertEq(counter.number(), x); |
||||
} |
||||
} |
@ -0,0 +1,31 @@ |
||||
from slither import Slither |
||||
|
||||
|
||||
def test_contract_info() -> None: |
||||
slither = Slither("./tests/source_unit") |
||||
|
||||
assert len(slither.compilation_units) == 1 |
||||
compilation_unit = slither.compilation_units[0] |
||||
|
||||
for source_unit in compilation_unit.crytic_compile_compilation_unit.source_units.values(): |
||||
source_unit.remove_metadata() |
||||
|
||||
counter_sol = compilation_unit.crytic_compile.filename_lookup( |
||||
"tests/source_unit/src/Counter.sol" |
||||
) |
||||
assert ( |
||||
compilation_unit.scopes[counter_sol].bytecode_init( |
||||
compilation_unit.crytic_compile_compilation_unit, "Counter" |
||||
) |
||||
== "608060405234801561001057600080fd5b5060f78061001f6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80633fb5c1cb1460415780638381f58a146053578063d09de08a14606d575b600080fd5b6051604c3660046083565b600055565b005b605b60005481565b60405190815260200160405180910390f35b6051600080549080607c83609b565b9190505550565b600060208284031215609457600080fd5b5035919050565b60006001820160ba57634e487b7160e01b600052601160045260246000fd5b506001019056fe" |
||||
) |
||||
|
||||
counter2_sol = compilation_unit.crytic_compile.filename_lookup( |
||||
"tests/source_unit/src/Counter2.sol" |
||||
) |
||||
assert ( |
||||
compilation_unit.scopes[counter2_sol].bytecode_init( |
||||
compilation_unit.crytic_compile_compilation_unit, "Counter" |
||||
) |
||||
== "6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfe" |
||||
) |
Loading…
Reference in new issue