Merge pull request #1484 from crytic/detect/self-call

Recommend reading variable without additional STATICCALL
pull/1542/head
Feist Josselin 2 years ago committed by GitHub
commit dbc368fe75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      slither/detectors/all_detectors.py
  2. 60
      slither/detectors/variables/var_read_using_this.py
  3. 33
      tests/detectors/var-read-using-this/0.4.25/var_read_using_this.sol
  4. 3
      tests/detectors/var-read-using-this/0.4.25/var_read_using_this.sol.0.4.25.VarReadUsingThis.json
  5. 39
      tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol
  6. 736
      tests/detectors/var-read-using-this/0.5.16/var_read_using_this.sol.0.5.16.VarReadUsingThis.json
  7. 39
      tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol
  8. 736
      tests/detectors/var-read-using-this/0.6.11/var_read_using_this.sol.0.6.11.VarReadUsingThis.json
  9. 39
      tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol
  10. 736
      tests/detectors/var-read-using-this/0.7.6/var_read_using_this.sol.0.7.6.VarReadUsingThis.json
  11. 39
      tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol
  12. 736
      tests/detectors/var-read-using-this/0.8.15/var_read_using_this.sol.0.8.15.VarReadUsingThis.json
  13. 21
      tests/test_detectors.py

@ -3,6 +3,7 @@ from .examples.backdoor import Backdoor
from .variables.uninitialized_state_variables import UninitializedStateVarsDetection
from .variables.uninitialized_storage_variables import UninitializedStorageVars
from .variables.uninitialized_local_variables import UninitializedLocalVars
from .variables.var_read_using_this import VarReadUsingThis
from .attributes.constant_pragma import ConstantPragma
from .attributes.incorrect_solc import IncorrectSolc
from .attributes.locked_ether import LockedEther

@ -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)

@ -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,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"
}
]
]

@ -1557,6 +1557,27 @@ ALL_TEST_OBJECTS = [
"permit_domain_state_var_collision.sol",
"0.8.0",
),
Test(
all_detectors.VarReadUsingThis,
"var_read_using_this.sol",
"0.4.25",
),
Test(
all_detectors.VarReadUsingThis,
"var_read_using_this.sol",
"0.5.16",
),
Test(all_detectors.VarReadUsingThis, "var_read_using_this.sol", "0.6.11"),
Test(
all_detectors.VarReadUsingThis,
"var_read_using_this.sol",
"0.7.6",
),
Test(
all_detectors.VarReadUsingThis,
"var_read_using_this.sol",
"0.8.15",
),
]

Loading…
Cancel
Save