Skip to content

Commit

Permalink
Merge pull request #2671 from crytic/dev-reorder-yul-ident-parsing
Browse files Browse the repository at this point in the history
Fix order yul parsing identifiers
  • Loading branch information
montyly authored Feb 20, 2025
2 parents f6413e6 + 43dc3bd commit f0eb2bb
Show file tree
Hide file tree
Showing 12 changed files with 45 additions and 15 deletions.
29 changes: 14 additions & 15 deletions slither/solc_parsing/yul/parse_yul.py
Original file line number Diff line number Diff line change
Expand Up @@ -798,27 +798,12 @@ def parse_yul_identifier(root: YulScope, _node: YulNode, ast: Dict) -> Optional[
if name in builtins:
return Identifier(YulBuiltin(name))

# check function-scoped variables
parent_func = root.parent_func
if parent_func:
local_variable = parent_func.get_local_variable_from_name(name)
if local_variable:
return Identifier(local_variable)

if isinstance(parent_func, FunctionContract):
# Variables must be looked from the contract declarer
assert parent_func.contract_declarer
state_variable = parent_func.contract_declarer.get_state_variable_from_name(name)
if state_variable:
return Identifier(state_variable)

# check yul-scoped variable
variable = root.get_yul_local_variable_from_name(name)
if variable:
return Identifier(variable.underlying)

# check yul-scoped function

func = root.get_yul_local_function_from_name(name)
if func:
return Identifier(func.underlying)
Expand All @@ -840,6 +825,20 @@ def parse_yul_identifier(root: YulScope, _node: YulNode, ast: Dict) -> Optional[
if func:
return Identifier(func.underlying)

# check function-scoped variables
parent_func = root.parent_func
if parent_func:
local_variable = parent_func.get_local_variable_from_name(name)
if local_variable:
return Identifier(local_variable)

if isinstance(parent_func, FunctionContract):
# Variables must be looked from the contract declarer
assert parent_func.contract_declarer
state_variable = parent_func.contract_declarer.get_state_variable_from_name(name)
if state_variable:
return Identifier(state_variable)

magic_suffix = _parse_yul_magic_suffixes(name, root)
if magic_suffix:
return magic_suffix
Expand Down
10 changes: 10 additions & 0 deletions tests/e2e/solc_parsing/test_data/assembly-functions.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,13 @@ contract A {
}
}
}

// Issue https://github.com/crytic/slither/issues/2655
contract B {
function test(int256 a) internal {
assembly {
function a() {}
function b() { a() }
}
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,10 @@
"foo.asm_0.w.a()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n}\n",
"foo.asm_0.w.b()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n",
"foo.asm_0.g()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n"
},
"B": {
"test(int256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: END INLINE ASM 2\n\"];\n}\n",
"test.asm_0.a()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n}\n",
"test.asm_0.b()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n"
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"A": {
"foo()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: END INLINE ASM 2\n\"];\n}\n"
},
"B": {
"test(int256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: END INLINE ASM 2\n\"];\n}\n"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,10 @@
"foo.asm_0.w.a()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n}\n",
"foo.asm_0.w.b()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n",
"foo.asm_0.g()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n"
},
"B": {
"test(int256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: END INLINE ASM 2\n\"];\n}\n",
"test.asm_0.a()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n}\n",
"test.asm_0.b()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n"
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"A": {
"foo()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: END INLINE ASM 2\n\"];\n}\n"
},
"B": {
"test(int256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: END INLINE ASM 2\n\"];\n}\n"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,10 @@
"foo.asm_0.w.a()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n}\n",
"foo.asm_0.w.b()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n",
"foo.asm_0.g()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n"
},
"B": {
"test(int256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: END INLINE ASM 2\n\"];\n}\n",
"test.asm_0.a()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n}\n",
"test.asm_0.b()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n"
}
}

0 comments on commit f0eb2bb

Please sign in to comment.