From e3b75c003eccbacd5577278dfe2c92752a187b94 Mon Sep 17 00:00:00 2001 From: feliam Date: Fri, 15 Apr 2022 05:44:53 -0300 Subject: [PATCH] Print all entry points not reaching whenNotPaused. Fix - 1114 (#1128) New printer pausable: print what functions use whenNotPaused. Fix #1114 Co-authored-by: Josselin --- slither/printers/all_printers.py | 1 + slither/printers/summary/when_not_paused.py | 61 +++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 slither/printers/summary/when_not_paused.py diff --git a/slither/printers/all_printers.py b/slither/printers/all_printers.py index 833ff6494d..eca7ec5b6d 100644 --- a/slither/printers/all_printers.py +++ b/slither/printers/all_printers.py @@ -17,3 +17,4 @@ from .summary.constructor_calls import ConstructorPrinter from .guidance.echidna import Echidna from .summary.evm import PrinterEVM +from .summary.when_not_paused import PrinterWhenNotPaused diff --git a/slither/printers/summary/when_not_paused.py b/slither/printers/summary/when_not_paused.py new file mode 100644 index 0000000000..d8a57b6c79 --- /dev/null +++ b/slither/printers/summary/when_not_paused.py @@ -0,0 +1,61 @@ +""" + Module printing summary of the contract +""" + +from slither.core.declarations import Function +from slither.core.declarations.function import SolidityFunction +from slither.printers.abstract_printer import AbstractPrinter +from slither.utils import output +from slither.utils.myprettytable import MyPrettyTable + + +def _use_modifier(function: Function, modifier_name: str = "whenNotPaused") -> bool: + if function.is_constructor or function.view or function.pure: + return False + + for internal_call in function.all_internal_calls(): + if isinstance(internal_call, SolidityFunction): + continue + if any(modifier.name == modifier_name for modifier in function.modifiers): + return True + return False + + +class PrinterWhenNotPaused(AbstractPrinter): + + ARGUMENT = "pausable" + HELP = "Print functions that do not use whenNotPaused" + + WIKI = "https://github.com/trailofbits/slither/wiki/Printer-documentation#when-not-paused" + + def output(self, _filename: str) -> output.Output: + """ + _filename is not used + Args: + _filename(string) + """ + + modifier_name: str = "whenNotPaused" + + txt = "" + txt += "Constructor and pure/view functions are not displayed\n" + all_tables = [] + for contract in self.slither.contracts: + + txt += f"\n{contract.name}:\n" + table = MyPrettyTable(["Name", "Use whenNotPaused"]) + + for function in contract.functions_entry_points: + status = "X" if _use_modifier(function, modifier_name) else "" + table.add_row([function.solidity_signature, status]) + + txt += str(table) + "\n" + all_tables.append((contract.name, table)) + + self.info(txt) + + res = self.generate_output(txt) + for name, table in all_tables: + res.add_pretty_table(table, name) + + return res