PathExtractor

Struct PathExtractor 

Source
pub struct PathExtractor<'tcx> {
    tcx: TyCtxt<'tcx>,
    def_id: DefId,
    checkpoints: Vec<Checkpoint<'tcx>>,
    allow_repeat: usize,
}
Expand description

Enumerates finite, SCC-aware verification paths from the function entry to each unsafe checkpoint in a single function body.

PathExtractor is the first stage of the verification pipeline. It takes a function’s MIR control-flow graph and a list of unsafe checkpoints, then produces a [CheckpointPaths] value that maps every checkpoint to a set of acyclic block-level paths reaching it.

§Pipeline role

PathExtractor ──► BackwardSlicer ──► ForwardVerifier ──► SmtChecker
   (paths)          (relevant items)    (abstract facts)    (satisfiability)

The paths produced here determine which MIR instructions the slicer will inspect and in what order, so path quality directly affects verification precision.

§SCC handling

Loops (strongly connected components) are detected and collapsed by PathGraph. The allow_repeat parameter controls how many extra iterations of each SCC postfix are appended beyond the first — useful for modeling loop-carried effects without unrolling indefinitely.

§Path limit

Per-checkpoint path count is capped at PATH_LIMIT (1024) to prevent exponential blow-up in functions with many branches.

Fields§

§tcx: TyCtxt<'tcx>

Compiler type context used for MIR access and name resolution.

§def_id: DefId

The function whose MIR body is being analyzed.

§checkpoints: Vec<Checkpoint<'tcx>>

Unsafe checkpoints (call terminators, raw-ptr derefs, static mut accesses) discovered in the function’s MIR body.

§allow_repeat: usize

Number of extra SCC postfix repetitions allowed (default 0).

Implementations§

Source§

impl<'tcx> PathExtractor<'tcx>

Source

pub fn new( tcx: TyCtxt<'tcx>, def_id: DefId, checkpoints: Vec<Checkpoint<'tcx>>, allow_repeat: usize, ) -> Self

Create a path extractor for def_id and the checkpoints found in that body.

Path extraction (SCC detection, enumeration, filtering) is deferred until [run] is called.

allow_repeat controls how many times a repeated SCC postfix segment is allowed beyond the first occurrence. Default is 0 (no extra repeats).

Source

pub fn run(self) -> Vec<CallGroup<'tcx>>

Run path extraction, consuming the extractor.

Returns a Vec<CallGroup> — one entry per unique callee DefId. Checkpoints that target the same callee share a single PathTree, avoiding redundant subtree construction.

Auto Trait Implementations§

§

impl<'tcx> Freeze for PathExtractor<'tcx>

§

impl<'tcx> !RefUnwindSafe for PathExtractor<'tcx>

§

impl<'tcx> !Send for PathExtractor<'tcx>

§

impl<'tcx> !Sync for PathExtractor<'tcx>

§

impl<'tcx> Unpin for PathExtractor<'tcx>

§

impl<'tcx> !UnwindSafe for PathExtractor<'tcx>

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,