VerifyTargetCollector

Struct VerifyTargetCollector 

Source
pub struct VerifyTargetCollector<'tcx> {
    tcx: TyCtxt<'tcx>,
    pub function_targets: Vec<FunctionTarget<'tcx>>,
    pub struct_targets: HashMap<DefId, StructTarget<'tcx>>,
    fn_contract_cache: HashMap<DefId, FnContracts<'tcx>>,
}
Expand description

Visitor that collects targets annotated with #[rapx::verify].

Fields§

§tcx: TyCtxt<'tcx>§function_targets: Vec<FunctionTarget<'tcx>>

All function targets to verify collected from the current crate.

§struct_targets: HashMap<DefId, StructTarget<'tcx>>

All struct targets to verify collected from the current crate.

§fn_contract_cache: HashMap<DefId, FnContracts<'tcx>>

Cached contracts for each callee function so repeated callees are parsed once.

Implementations§

Source§

impl<'tcx> VerifyTargetCollector<'tcx>

Source

pub fn new(tcx: TyCtxt<'tcx>) -> Self

Creates a new collector for the current type context.

Source

fn is_std_crate_def_id(&self, def_id: DefId) -> bool

Returns whether the given definition belongs to a standard Rust crate.

Source

fn get_fn_contracts(&mut self, callee_def_id: DefId) -> FnContracts<'tcx>

Returns (and caches) the contracts for an unsafe callee.

Contracts are resolved with the following priority:

  1. Inline RAPx annotations attached to the callee.
  2. If no annotations are found and the callee belongs to the standard library, fall back to the bundled JSON contract database.

Results are memoized in fn_contract_cache to avoid recomputation.

Source

fn has_rapx_verify_attr(&self, def_id: LocalDefId) -> bool

Checks whether a local function has the exact tool attribute #[rapx::verify].

Source

fn build_function_target(&mut self, def_id: DefId) -> FunctionTarget<'tcx>

Builds a function target to verify from a function definition.

Source

fn get_owner_struct_def_id(&self, def_id: DefId) -> Option<DefId>

Returns the owning struct definition when the function is a method on a struct.

Source

fn push_function_target(&mut self, function_target: FunctionTarget<'tcx>)

Adds a function target and updates its owning struct target when applicable.

Trait Implementations§

Source§

impl<'tcx> Visitor<'tcx> for VerifyTargetCollector<'tcx>

Source§

fn visit_fn( &mut self, _fk: FnKind<'tcx>, _fd: &'tcx FnDecl<'tcx>, _b: BodyId, _span: Span, id: LocalDefId, ) -> Self::Result

Visits each function body and records those annotated with #[rapx::verify].

For every function target to verify, this also computes its unsafe callees and the safety preconditions required by those callees.

Source§

type NestedFilter = OnlyBodies

Override this type to control which nested HIR are visited; see [NestedFilter] for details. If you override this type, you must also override maybe_tcx. Read more
Source§

fn maybe_tcx(&mut self) -> Self::MaybeTyCtxt

If type NestedFilter is set to visit nested items, this method must also be overridden to provide a map to retrieve nested items.
§

type MaybeTyCtxt = <Self::NestedFilter as NestedFilter<'v>>::MaybeTyCtxt

§

type Result = ()

The result type of the visit_* methods. Can be either (), or ControlFlow<T>.
§

fn visit_nested_item(&mut self, id: ItemId) -> Self::Result

Invoked when a nested item is encountered. By default, when Self::NestedFilter is nested_filter::None, this method does nothing. You probably don’t want to override this method – instead, override [Self::NestedFilter] or use the “shallow” or “deep” visit patterns described at [rustc_hir::intravisit]. The only reason to override this method is if you want a nested pattern but cannot supply a TyCtxt; see maybe_tcx for advice.
§

fn visit_nested_trait_item(&mut self, id: TraitItemId) -> Self::Result

Like visit_nested_item(), but for trait items. See visit_nested_item() for advice on when to override this method.
§

fn visit_nested_impl_item(&mut self, id: ImplItemId) -> Self::Result

Like visit_nested_item(), but for impl items. See visit_nested_item() for advice on when to override this method.
§

fn visit_nested_foreign_item(&mut self, id: ForeignItemId) -> Self::Result

Like visit_nested_item(), but for foreign items. See visit_nested_item() for advice on when to override this method.
§

fn visit_nested_body(&mut self, id: BodyId) -> Self::Result

Invoked to visit the body of a function, method or closure. Like visit_nested_item, does nothing by default unless you override Self::NestedFilter.
§

fn visit_param(&mut self, param: &'v Param<'v>) -> Self::Result

§

fn visit_item(&mut self, i: &'v Item<'v>) -> Self::Result

Visits the top-level item and (optionally) nested items / impl items. See visit_nested_item for details.
§

fn visit_body(&mut self, b: &Body<'v>) -> Self::Result

§

fn visit_id(&mut self, _hir_id: HirId) -> Self::Result

§

fn visit_name(&mut self, _name: Symbol) -> Self::Result

§

fn visit_ident(&mut self, ident: Ident) -> Self::Result

§

fn visit_mod(&mut self, m: &'v Mod<'v>, _s: Span, _n: HirId) -> Self::Result

§

fn visit_foreign_item(&mut self, i: &'v ForeignItem<'v>) -> Self::Result

§

fn visit_local(&mut self, l: &'v LetStmt<'v>) -> Self::Result

§

fn visit_block(&mut self, b: &'v Block<'v>) -> Self::Result

§

fn visit_stmt(&mut self, s: &'v Stmt<'v>) -> Self::Result

§

fn visit_arm(&mut self, a: &'v Arm<'v>) -> Self::Result

§

fn visit_pat(&mut self, p: &'v Pat<'v>) -> Self::Result

§

fn visit_pat_field(&mut self, f: &'v PatField<'v>) -> Self::Result

§

fn visit_pat_expr(&mut self, expr: &'v PatExpr<'v>) -> Self::Result

§

fn visit_lit( &mut self, _hir_id: HirId, _lit: Spanned<LitKind>, _negated: bool, ) -> Self::Result

§

fn visit_anon_const(&mut self, c: &'v AnonConst) -> Self::Result

§

fn visit_inline_const(&mut self, c: &'v ConstBlock) -> Self::Result

§

fn visit_generic_arg(&mut self, generic_arg: &'v GenericArg<'v>) -> Self::Result

§

fn visit_ty(&mut self, t: &'v Ty<'v, AmbigArg>) -> Self::Result

All types are treated as ambiguous types for the purposes of hir visiting in order to ensure that visitors can handle infer vars without it being too error-prone. Read more
§

fn visit_const_item_rhs(&mut self, c: ConstItemRhs<'v>) -> Self::Result

§

fn visit_const_arg(&mut self, c: &'v ConstArg<'v, AmbigArg>) -> Self::Result

All consts are treated as ambiguous consts for the purposes of hir visiting in order to ensure that visitors can handle infer vars without it being too error-prone. Read more
§

fn visit_infer( &mut self, inf_id: HirId, inf_span: Span, kind: InferKind<'v>, ) -> Self::Result

§

fn visit_lifetime(&mut self, lifetime: &'v Lifetime) -> Self::Result

§

fn visit_expr(&mut self, ex: &'v Expr<'v>) -> Self::Result

§

fn visit_expr_field(&mut self, field: &'v ExprField<'v>) -> Self::Result

§

fn visit_pattern_type_pattern(&mut self, p: &'v TyPat<'v>) -> Self::Result

§

fn visit_generic_param(&mut self, p: &'v GenericParam<'v>) -> Self::Result

§

fn visit_const_param_default( &mut self, _param: HirId, ct: &'v ConstArg<'v>, ) -> Self::Result

§

fn visit_generics(&mut self, g: &'v Generics<'v>) -> Self::Result

§

fn visit_where_predicate( &mut self, predicate: &'v WherePredicate<'v>, ) -> Self::Result

§

fn visit_fn_ret_ty(&mut self, ret_ty: &'v FnRetTy<'v>) -> Self::Result

§

fn visit_fn_decl(&mut self, fd: &'v FnDecl<'v>) -> Self::Result

§

fn visit_use( &mut self, path: &'v Path<'v, PerNS<Option<Res>>>, hir_id: HirId, ) -> Self::Result

§

fn visit_trait_item(&mut self, ti: &'v TraitItem<'v>) -> Self::Result

§

fn visit_trait_item_ref(&mut self, ii: &'v TraitItemId) -> Self::Result

§

fn visit_impl_item(&mut self, ii: &'v ImplItem<'v>) -> Self::Result

§

fn visit_foreign_item_ref(&mut self, ii: &'v ForeignItemId) -> Self::Result

§

fn visit_impl_item_ref(&mut self, ii: &'v ImplItemId) -> Self::Result

§

fn visit_trait_ref(&mut self, t: &'v TraitRef<'v>) -> Self::Result

§

fn visit_param_bound(&mut self, bounds: &'v GenericBound<'v>) -> Self::Result

§

fn visit_precise_capturing_arg( &mut self, arg: &'v PreciseCapturingArgKind<&'v Lifetime, PreciseCapturingNonLifetimeArg>, ) -> Self::Result

§

fn visit_poly_trait_ref(&mut self, t: &'v PolyTraitRef<'v>) -> Self::Result

§

fn visit_opaque_ty(&mut self, opaque: &'v OpaqueTy<'v>) -> Self::Result

§

fn visit_variant_data(&mut self, s: &'v VariantData<'v>) -> Self::Result

§

fn visit_field_def(&mut self, s: &'v FieldDef<'v>) -> Self::Result

§

fn visit_enum_def(&mut self, enum_definition: &'v EnumDef<'v>) -> Self::Result

§

fn visit_variant(&mut self, v: &'v Variant<'v>) -> Self::Result

§

fn visit_label(&mut self, label: &'v Label) -> Self::Result

§

fn visit_qpath( &mut self, qpath: &'v QPath<'v>, id: HirId, _span: Span, ) -> Self::Result

§

fn visit_path(&mut self, path: &Path<'v>, _id: HirId) -> Self::Result

§

fn visit_path_segment( &mut self, path_segment: &'v PathSegment<'v>, ) -> Self::Result

§

fn visit_generic_args( &mut self, generic_args: &'v GenericArgs<'v>, ) -> Self::Result

§

fn visit_assoc_item_constraint( &mut self, constraint: &'v AssocItemConstraint<'v>, ) -> Self::Result

§

fn visit_attribute(&mut self, _attr: &'v Attribute) -> Self::Result

§

fn visit_defaultness(&mut self, defaultness: &'v Defaultness) -> Self::Result

§

fn visit_inline_asm( &mut self, asm: &'v InlineAsm<'v>, id: HirId, ) -> Self::Result

Auto Trait Implementations§

§

impl<'tcx> Freeze for VerifyTargetCollector<'tcx>

§

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

§

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

§

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

§

impl<'tcx> Unpin for VerifyTargetCollector<'tcx>

§

impl<'tcx> !UnwindSafe for VerifyTargetCollector<'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