Skip to content

fix: update register_printer to handle multiple compilation units#3025

Open
sulphur-swarm wants to merge 1 commit into
crytic:masterfrom
sulphur-swarm:fix/issue-1780-register-printer-multi-cu
Open

fix: update register_printer to handle multiple compilation units#3025
sulphur-swarm wants to merge 1 commit into
crytic:masterfrom
sulphur-swarm:fix/issue-1780-register-printer-multi-cu

Conversation

@sulphur-swarm

Copy link
Copy Markdown

Summary

Fixes #1780.

register_detector already iterates over self.compilation_units to create one detector instance per compilation unit. register_printer was missing this loop — it unconditionally created a single printer instance regardless of how many compilation units exist.

Changes

  • slither/slither.py: Wrap printer instantiation in register_printer in a for compilation_unit in self.compilation_units: loop, mirroring the pattern used by register_detector.
  • slither/printers/abstract_printer.py: Update AbstractPrinter.__init__ to accept a compilation_unit parameter as the first argument (mirroring AbstractDetector), and set self.contracts = compilation_unit.contracts instead of slither.contracts.
  • slither/printers/inheritance/inheritance_graph.py: Update PrinterInheritanceGraph.__init__ to pass the compilation unit through to super().__init__().
  • tests/e2e/printers/test_printers.py: Update tests to use register_printer instead of direct instantiation, which is the correct API.

Before

def register_printer(self, printer_class: type[AbstractPrinter]) -> None:
    _check_common_things("printer", printer_class, AbstractPrinter, self._printers)
    instance = printer_class(self, logger_printer)
    self._printers.append(instance)

After

def register_printer(self, printer_class: type[AbstractPrinter]) -> None:
    _check_common_things("printer", printer_class, AbstractPrinter, self._printers)
    for compilation_unit in self.compilation_units:
        instance = printer_class(compilation_unit, self, logger_printer)
        self._printers.append(instance)

This fix was contributed with AI assistance by SwarmFix (sulphur-swarm).

…ytic#1780)

register_detector iterates over self.compilation_units to create one
detector instance per compilation unit. register_printer was missing
this loop, creating a single instance regardless of the number of
compilation units.

Update register_printer to mirror register_detector by wrapping
instantiation in a for-loop over self.compilation_units.

Also update AbstractPrinter.__init__ to accept a compilation_unit
parameter (mirroring AbstractDetector), and update unregister_printer
to remove all instances of a given printer class (not just the first),
since multiple instances may now be registered.

Fixes: crytic#1780
@sulphur-swarm sulphur-swarm requested a review from smonicas as a code owner May 17, 2026 05:46
@CLAassistant

CLAassistant commented May 17, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

update register printer to consider multiple compilation units

2 participants