Merge pull request #815 from crytic/dev-0.8

Improve parsing of Solidity 0.8
pull/817/head
Feist Josselin 4 years ago committed by GitHub
commit 7fe4253e1a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 30
      slither/solc_parsing/expressions/expression_parsing.py

@ -892,7 +892,16 @@ def parse_expression(expression: Dict, caller_context: CallerContext) -> "Expres
assert type_name[caller_context.get_key()] == "UserDefinedTypeName" assert type_name[caller_context.get_key()] == "UserDefinedTypeName"
if is_compact_ast: if is_compact_ast:
contract_name = type_name["name"]
# Changed introduced in Solidity 0.8
# see https://github.com/crytic/slither/issues/794
# TODO explore more the changes introduced in 0.8 and the usage of pathNode/IdentifierPath
if "name" not in type_name:
assert "pathNode" in type_name and "name" in type_name["pathNode"]
contract_name = type_name["pathNode"]["name"]
else:
contract_name = type_name["name"]
else: else:
contract_name = type_name["attributes"]["name"] contract_name = type_name["attributes"]["name"]
new = NewContract(contract_name) new = NewContract(contract_name)
@ -924,4 +933,23 @@ def parse_expression(expression: Dict, caller_context: CallerContext) -> "Expres
base = parse_expression(expression["baseExpression"], caller_context) base = parse_expression(expression["baseExpression"], caller_context)
return base return base
# Introduced with solc 0.8
if name == "IdentifierPath":
if caller_context.is_compact_ast:
value = expression["name"]
if "referencedDeclaration" in expression:
referenced_declaration = expression["referencedDeclaration"]
else:
referenced_declaration = None
var = find_variable(value, caller_context, referenced_declaration)
identifier = Identifier(var)
identifier.set_offset(src, caller_context.slither)
return identifier
raise ParsingError("IdentifierPath not currently supported for the legacy ast")
raise ParsingError("Expression not parsed %s" % name) raise ParsingError("Expression not parsed %s" % name)

Loading…
Cancel
Save