An optional detector that highlights all instances where inherited trait variables are directly modified.

Traits should provide setter methods to ensure that invariants related to their state are preserved. Directly modifying trait variables (e.g., self.traitVar = 42) can violate these invariants, leading to potential bugs or security vulnerabilities. This detector warns when such direct modifications occur, prompting further review by auditors.

trait T {
  balance: Int;
}

contract C with T {
  balance: Int = 42;
  fun updateBalance() {
    self.balance = 100; // Suspicious: Highlighted by the detector
  }
}

Use instead:

trait T {
  balance: Int;
  fun setBalance(newBalance: Int) {
    require(newBalance > 0, "balance cannot be negative"); // Invariant check
    self.balance = newBalance;
  }
}

contract C with T {
  balance: Int = 42;
  fun updateBalance() {
    self.setBalance(100); // OK: Invariant preserved
  }
}

Hierarchy (view full)

Constructors

Properties

severity: Severity = Severity.LOW

Gets the severity of the detector.

Accessors

  • get id(): string
  • Gets the short identifier of the detector, used in analyzer warnings.

    Returns string

    The unique identifier of the detector.

  • get shareImportedWarnings(): WarningsBehavior
  • Defines the behavior of warnings generated by this detector when working with multiple projects within a single Tact configuration.

    Here are the available options:

    1. "union" Leave this value if you don't care about warnings generated in other projects.
    2. "intersect" If the warning is generated for some source location of the imported file, it should be generated by each of the projects. Example: Constants from an imported file should not be reported iff they are unused in all the projects, so you need "intersect".

    Returns WarningsBehavior

  • get usesSouffle(): boolean
  • Checks whether this detector needs the Soufflé binary to be executed.

    Returns boolean

Methods