Skip to content

feat: add detectors for unused events and unused modifiers#2970

Open
ep0chzer0 wants to merge 2 commits intocrytic:masterfrom
ep0chzer0:feature/dead-code-events-modifiers
Open

feat: add detectors for unused events and unused modifiers#2970
ep0chzer0 wants to merge 2 commits intocrytic:masterfrom
ep0chzer0:feature/dead-code-events-modifiers

Conversation

@ep0chzer0
Copy link
Contributor

Summary

Adds two new informational detectors for comprehensive dead code detection, addressing #2782:

  • unused-events — Detects events declared but never emitted anywhere in the compilation unit
  • unused-modifiers — Detects modifiers declared but never applied to any function

Together with the unused custom errors detector in #2902, this completes the dead code detection coverage for errors, events, and modifiers requested in #2782.

Detection Logic

Unused Events

  • Scans all functions/modifiers for EventCall IR operations to build a set of emitted event names
  • Iterates all contracts (not just derived) to catch orphaned events in base contracts
  • Skips interface contracts and dependencies

Unused Modifiers

  • Builds a set of applied modifiers by checking function.modifiers across all derived contracts
  • Handles inheritance: skips virtual modifiers overridden in child contracts (both via overridden_by and manual inheritance chain check)
  • Skips unimplemented (abstract) modifiers, interfaces, and dependencies

Test Coverage

Unused Events (6 contracts):

  • Unused events flagged: NeverEmitted, AlsoNeverEmitted, OrphanEvent (in base contract)
  • Correctly NOT flagged: emitted events, inherited events emitted by children, interface events

Unused Modifiers (5 contracts):

  • Unused modifiers flagged: neverUsed, alsoNeverUsed, unusedVirtualMod (virtual but not overridden)
  • Correctly NOT flagged: applied modifiers, virtual modifiers overridden by children

Files Changed

  • slither/detectors/functions/unused_events.py — New detector
  • slither/detectors/functions/unused_modifiers.py — New detector
  • slither/detectors/all_detectors.py — Register both detectors
  • tests/e2e/detectors/test_detectors.py — Add test entries
  • tests/e2e/detectors/test_data/unused-events/ — Test contracts and artifacts
  • tests/e2e/detectors/test_data/unused-modifiers/ — Test contracts and artifacts
  • tests/e2e/detectors/snapshots/ — Expected output snapshots

All 383 detector tests pass (381 existing + 2 new).

Closes #2782 (events + modifiers; errors covered by #2902)

Add two new informational detectors to identify dead code:

- `unused-events`: Detects events declared but never emitted anywhere
  in the compilation unit. Skips interface contracts and dependencies.

- `unused-modifiers`: Detects modifiers declared but never applied to
  any function. Handles inheritance correctly by skipping virtual
  modifiers that are overridden in child contracts.

Both detectors include comprehensive test contracts covering:
- Basic unused/used elements
- Inheritance chains (base events emitted by children)
- Virtual modifier override patterns
- Interface event declarations

Closes crytic#2782 (partial - errors covered by crytic#2902)
@ep0chzer0 ep0chzer0 requested a review from smonicas as a code owner February 23, 2026 18:11
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.

Enhancement: Comprehensive Dead Code Detection for Errors, Events, and Modifiers

1 participant