crytic / slither

Static Analyzer for Solidity and Vyper
https://blog.trailofbits.com/2018/10/19/slither-a-solidity-static-analysis-framework/
GNU Affero General Public License v3.0
5.29k stars 963 forks source link

[Bug]: IR generation failing #2020

Closed anajuliabit closed 1 year ago

anajuliabit commented 1 year ago

Describe the issue:

IR generation failing.

I've identified the issue lies with the following line of code: uint256 totalRegions = uint256(type(BosonTypes.PausableRegion).max); It appears that during the Slither IR generation process, it's being transformed into: totalRegions = uint256(type()(BosonTypes.PausableRegion).max)

This seems to be a bug that needs addressing.

Code example to reproduce the issue:

Clone https://github.com/bosonprotocol/boson-protocol-contracts Go to commit https://github.com/bosonprotocol/boson-protocol-contracts/pull/644/commits/c9ee232050034e9f12b0b17ef8c56466f0e5ba11 run slither . --checklist

Version:

0.9.5

Relevant log output:

'npx hardhat clean' running (wd: /Users/anajulia/dev/code/boson-protocol-contracts)
'npx hardhat clean --global' running (wd: /Users/anajulia/dev/code/boson-protocol-contracts)
'npx hardhat compile --force' running (wd: /Users/anajulia/dev/code/boson-protocol-contracts)
ERROR:SlitherSolcParsing:
Failed to generate IR for PauseHandlerFacet.getPausedRegions. Please open an issue https://github.com/crytic/slither/issues.
PauseHandlerFacet.getPausedRegions (contracts/protocol/facets/PauseHandlerFacet.sol#72-102):
        status = protocolStatus()
        totalRegions = uint256(type()(BosonTypes.PausableRegion).max)
        regions = new BosonTypes.PausableRegion[](totalRegions)
        status.pauseScenario == ALL_REGIONS_MASK
        i = 0
        i < totalRegions
        regions[i] = BosonTypes.PausableRegion(i)
        i ++
        regions
        count = 0
        i_scope_0 = 0
        i_scope_0 < totalRegions
        (status.pauseScenario & (1 << i_scope_0)) != 0
        regions[count] = BosonTypes.PausableRegion(i_scope_0)
        count ++
        i_scope_0 ++
        mstore(uint256,uint256)(regions,count)
Traceback (most recent call last):
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/__main__.py", line 814, in main_impl
    ) = process_all(filename, args, detector_classes, printer_classes)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/__main__.py", line 102, in process_all
    ) = process_single(compilation, args, detector_classes, printer_classes)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/__main__.py", line 80, in process_single
    slither = Slither(target, ast_format=ast, **vars(args))
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/slither.py", line 135, in __init__
    self._init_parsing_and_analyses(kwargs.get("skip_analyze", False))
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/slither.py", line 155, in _init_parsing_and_analyses
    raise e
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/slither.py", line 151, in _init_parsing_and_analyses
    parser.analyze_contracts()
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 541, in analyze_contracts
    self._convert_to_slithir()
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 767, in _convert_to_slithir
    raise e
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 752, in _convert_to_slithir
    func.generate_slithir_and_analyze()
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/core/declarations/function.py", line 1760, in generate_slithir_and_analyze
    node.slithir_generation()
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/core/cfg/node.py", line 706, in slithir_generation
    self._irs = convert_expression(expression, self)  # type:ignore
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/slithir/convert.py", line 115, in convert_expression
    visitor = ExpressionToSlithIR(expression, node)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/slithir/expression_to_slithir.py", line 162, in __init__
    self._visit_expression(self.expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 43, in _visit_expression
    self._visit_assignement_operation(expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 99, in _visit_assignement_operation
    self._visit_expression(expression.expression_right)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 82, in _visit_expression
    self._visit_type_conversion(expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 155, in _visit_type_conversion
    self._visit_expression(expression.expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 93, in _visit_expression
    self._post_visit(expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 291, in _post_visit
    self._post_member_access(expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/slithir/expression_to_slithir.py", line 465, in _post_member_access
    assert isinstance(type_expression_found, Identifier)
AssertionError
ERROR:root:Error in .
ERROR:root:Traceback (most recent call last):
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/__main__.py", line 814, in main_impl
    ) = process_all(filename, args, detector_classes, printer_classes)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/__main__.py", line 102, in process_all
    ) = process_single(compilation, args, detector_classes, printer_classes)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/__main__.py", line 80, in process_single
    slither = Slither(target, ast_format=ast, **vars(args))
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/slither.py", line 135, in __init__
    self._init_parsing_and_analyses(kwargs.get("skip_analyze", False))
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/slither.py", line 155, in _init_parsing_and_analyses
    raise e
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/slither.py", line 151, in _init_parsing_and_analyses
    parser.analyze_contracts()
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 541, in analyze_contracts
    self._convert_to_slithir()
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 767, in _convert_to_slithir
    raise e
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 752, in _convert_to_slithir
    func.generate_slithir_and_analyze()
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/core/declarations/function.py", line 1760, in generate_slithir_and_analyze
    node.slithir_generation()
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/core/cfg/node.py", line 706, in slithir_generation
    self._irs = convert_expression(expression, self)  # type:ignore
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/slithir/convert.py", line 115, in convert_expression
    visitor = ExpressionToSlithIR(expression, node)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/slithir/expression_to_slithir.py", line 162, in __init__
    self._visit_expression(self.expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 43, in _visit_expression
    self._visit_assignement_operation(expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 99, in _visit_assignement_operation
    self._visit_expression(expression.expression_right)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 82, in _visit_expression
    self._visit_type_conversion(expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 155, in _visit_type_conversion
    self._visit_expression(expression.expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 93, in _visit_expression
    self._post_visit(expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/expression/expression.py", line 291, in _post_visit
    self._post_member_access(expression)
  File "/Users/anajulia/Library/Python/3.9/lib/python/site-packages/slither/visitors/slithir/expression_to_slithir.py", line 465, in _post_member_access
    assert isinstance(type_expression_found, Identifier)
AssertionError
smonicas commented 1 year ago

Same issue as #1602