Skip to main content

AlsoEffect

Struct AlsoEffect 

Source
pub struct AlsoEffect {
    pub krate: &'static [&'static str],
    pub on: AlsoOn,
    pub effects: &'static [&'static str],
    pub fs_kind: &'static [&'static str],
    pub row: &'static str,
    pub evidence: &'static str,
}
Expand description

SOUNDNESS R1612 — THE EFFECTS A CALL PERFORMS BESIDE THE ONE classify RETURNS.

classify answers ONE effect per path, and that one is the call’s PRIMARY: the effect whose locator (path, host, program, SQL) is the call’s own argument or receiver, which is why every surface rule (str_arg capture, the masking guard, fs_kind) is keyed on it. Some library entry points do a second thing whose locator the caller never sees — next_backoff draws entropy AND reads the clock, try_associate reads PATH AND stats the directories on it. Those are declared HERE, one row per rule, and charged beside the primary by also_effects, never instead of it.

Why a table and not a set-valued classify. The set is not uniform: the primary carries the call’s locator and the rest do not. A flat set would invite a charging site to publish the call’s literal as the locator of every effect in it (a fabricated surface), and the one thing every site must do for a secondary is the OPPOSITE — a secondary Fs/Net/ Exec/Db has a locator nobody can see, so it is marked incomplete (also_hides_locator) and a benign sibling literal cannot certify it. And the second-effect hook this replaces (reads_trust_store, R338) was asked by ONE of the four sites that charge a classify answer: candor-scan’s main path. The use-alias arm, the R1607 trait-dispatch arm and the deep engine (src/lib.rs) never asked it, so the trust-store Fs was charged or silent by spelling and by engine. One table, one function, every site — the shape masks_locator already has for the same reason (R806/R808).

The bar for a row is the family’s for any charge: an EXECUTED observation of the second effect inside the call, a pure neighbour of the same type that is not charged, and deny <E2> flipping 0→1 on a consumer. A row whose second effect is platform- or configuration-conditional says so in evidence; it is charged on the configuration where it was observed (the R338 trade: the default build on the platform the crate’s users run), and the condition is the row’s stated over-charge. Do NOT seed this table from covered.tsv’s self_scan_effects: that oracle’s extra effects are a union over every branch (1,306 of 2,020 covered rows carry one, 792 of them Clock and 468 Log, mostly timeouts and debug events inside a request), and adopting them is a priced decision, not a transcription (R1613).

Fields§

§krate: &'static [&'static str]

Crate names (post -→_) this row applies to.

§on: AlsoOn

Which paths in those crates.

§effects: &'static [&'static str]

The effects charged beside the primary. An entry equal to the primary is dropped by also_effects.

§fs_kind: &'static [&'static str]

The §2 fs direction of an Fs in effects — &["read"] only where the executed window showed no write (no O_WRONLY/O_RDWR/O_CREAT, only stat/access/read-only opens). Empty means the direction is unknown and the charging site records the poison marker, never a guess.

§row: &'static str

The SOUNDNESS row that carries the evidence.

§evidence: &'static str

What was executed, where, and under which condition.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.