Skip to main content

ImproperCTypesLint

Struct ImproperCTypesLint 

Source
pub(crate) struct ImproperCTypesLint {
    known_safe: RefCell<FxHashSet<(Hash128, u8)>>,
}
Expand description

Remembers types we already checked and found FFI-safe, so we don’t check the same type again every time it shows up in another function. We only remember “safe” types, never “unsafe” ones. That way we never need to keep the actual type around, just a fingerprint of it.

Fields§

§known_safe: RefCell<FxHashSet<(Hash128, u8)>>

A fingerprint of the type, not the type itself. Uses a big 128-bit fingerprint (not a smaller 64-bit one) so two different types can’t accidentally get treated as the same one.

Implementations§

Source§

impl<'tcx> ImproperCTypesLint

Source

fn cache_key( cx: &LateContext<'tcx>, ty: Ty<'tcx>, flags: RootUseFlags, ) -> (Hash128, u8)

Source

fn check_ffi_type( &self, cx: &LateContext<'tcx>, ty: Ty<'tcx>, state: VisitorState, span: Span, mode: CItemKind, check: impl FnOnce() -> FfiResult<'tcx>, )

Source§

impl ImproperCTypesLint

Source§

impl<'tcx> ImproperCTypesLint

Source

fn check_type_for_external_abi_fnptr( &mut self, cx: &LateContext<'tcx>, state: VisitorState, hir_ty: &Ty<'tcx>, ty: Ty<'tcx>, fn_mode: CItemKind, )

Find any fn-ptr types with external ABIs in ty, and FFI-checks them. For example, Option<extern "C" fn()> FFI-checks extern "C" fn().

Source

fn check_fn_for_external_abi_fnptr( &mut self, cx: &LateContext<'tcx>, fn_mode: CItemKind, def_id: LocalDefId, decl: &'tcx FnDecl<'_>, )

Regardless of a function’s need to be “ffi-safe”, look for fn-ptr argument/return types that need to be checked for ffi-safety.

Source

fn check_reprc_adt( &mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'tcx>, adt_def: AdtDef<'tcx>, )

For a local definition of a #[repr(C)] struct/enum/union, check that it is indeed FFI-safe.

Source

fn check_foreign_static( &mut self, cx: &LateContext<'tcx>, id: OwnerId, span: Span, )

Source

fn check_foreign_fn( &mut self, cx: &LateContext<'tcx>, fn_mode: CItemKind, def_id: LocalDefId, decl: &'tcx FnDecl<'_>, )

Check if a function’s argument types and result type are “ffi-safe”.

Source

fn process_ffi_result( &self, cx: &LateContext<'tcx>, sp: Span, res: FfiResult<'tcx>, fn_mode: CItemKind, )

Source

fn emit_ffi_unsafe_type_lint( &self, cx: &LateContext<'tcx>, ty: Ty<'tcx>, sp: Span, note: DiagMessage, help: Option<DiagMessage>, fn_mode: CItemKind, )

Trait Implementations§

Source§

impl Default for ImproperCTypesLint

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<'tcx> LateLintPass<'tcx> for ImproperCTypesLint

ImproperCTypesDefinitions checks items outside of foreign items (e.g. stuff that isn’t in extern "C" { } blocks):

  • extern "<abi>" fn definitions are checked in the same way as the ImproperCtypesDeclarations visitor checks functions if <abi> is external (e.g. “C”).
  • All other items which contain types (e.g. other functions, struct definitions, etc) are checked for extern fn-ptrs with external ABIs.
Source§

fn check_foreign_item(&mut self, cx: &LateContext<'tcx>, it: &ForeignItem<'tcx>)

Source§

fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'tcx>)

Source§

fn check_field_def( &mut self, cx: &LateContext<'tcx>, field: &'tcx FieldDef<'tcx>, )

Source§

fn check_fn( &mut self, cx: &LateContext<'tcx>, kind: FnKind<'tcx>, decl: &'tcx FnDecl<'_>, _: &'tcx Body<'_>, _: Span, id: LocalDefId, )

Source§

fn check_body(&mut self, _: &LateContext<'tcx>, _: &Body<'tcx>)

Source§

fn check_body_post(&mut self, _: &LateContext<'tcx>, _: &Body<'tcx>)

Source§

fn check_crate(&mut self, _: &LateContext<'tcx>)

Source§

fn check_crate_post(&mut self, _: &LateContext<'tcx>)

Source§

fn check_mod( &mut self, _: &LateContext<'tcx>, _: &'tcx Mod<'tcx>, _: LocalModId, )

Source§

fn check_item_post(&mut self, _: &LateContext<'tcx>, _: &'tcx Item<'tcx>)

Source§

fn check_local(&mut self, _: &LateContext<'tcx>, _: &'tcx LetStmt<'tcx>)

Source§

fn check_block(&mut self, _: &LateContext<'tcx>, _: &'tcx Block<'tcx>)

Source§

fn check_block_post(&mut self, _: &LateContext<'tcx>, _: &'tcx Block<'tcx>)

Source§

fn check_stmt(&mut self, _: &LateContext<'tcx>, _: &'tcx Stmt<'tcx>)

Source§

fn check_arm(&mut self, _: &LateContext<'tcx>, _: &'tcx Arm<'tcx>)

Source§

fn check_pat(&mut self, _: &LateContext<'tcx>, _: &'tcx Pat<'tcx>)

Source§

fn check_lit(&mut self, _: &LateContext<'tcx>, _: HirId, _: Lit, _: bool)

Source§

fn check_expr(&mut self, _: &LateContext<'tcx>, _: &'tcx Expr<'tcx>)

Source§

fn check_expr_post(&mut self, _: &LateContext<'tcx>, _: &'tcx Expr<'tcx>)

Source§

fn check_ty(&mut self, _: &LateContext<'tcx>, _: &'tcx Ty<'tcx, AmbigArg>)

Source§

fn check_generic_param( &mut self, _: &LateContext<'tcx>, _: &'tcx GenericParam<'tcx>, )

Source§

fn check_generics(&mut self, _: &LateContext<'tcx>, _: &'tcx Generics<'tcx>)

Source§

fn check_poly_trait_ref( &mut self, _: &LateContext<'tcx>, _: &'tcx PolyTraitRef<'tcx>, )

Source§

fn check_trait_item(&mut self, _: &LateContext<'tcx>, _: &'tcx TraitItem<'tcx>)

Source§

fn check_impl_item(&mut self, _: &LateContext<'tcx>, _: &'tcx ImplItem<'tcx>)

Source§

fn check_impl_item_post( &mut self, _: &LateContext<'tcx>, _: &'tcx ImplItem<'tcx>, )

Source§

fn check_variant(&mut self, _: &LateContext<'tcx>, _: &'tcx Variant<'tcx>)

Source§

fn check_path(&mut self, _: &LateContext<'tcx>, _: &Path<'tcx>, _: HirId)

Source§

fn check_attribute(&mut self, _: &LateContext<'tcx>, _: &'tcx Attribute)

Source§

fn check_attributes(&mut self, _: &LateContext<'tcx>, _: &'tcx [Attribute])

Source§

fn check_attributes_post(&mut self, _: &LateContext<'tcx>, _: &'tcx [Attribute])

Source§

impl LintPass for ImproperCTypesLint

Source§

fn name(&self) -> &'static str

Source§

fn get_lints(&self) -> LintVec

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Aligned for T

Source§

const ALIGN: Alignment

Alignment of Self.
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, R> CollectAndApply<T, R> for T

Source§

fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to f(&iter.collect::<Vec<_>>()).

Source§

type Output = R

Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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<K> IntoQueryKey<K> for K

Source§

fn into_query_key(self) -> K

Argument conversion from Self to K. This should always be a very cheap conversion, e.g. LocalDefId::to_def_id.
Source§

impl<T> MaybeResult<T> for T

Source§

type Error = !

Source§

fn from(_: Result<T, <T as MaybeResult<T>>::Error>) -> T

Source§

fn to_result(self) -> Result<T, <T as MaybeResult<T>>::Error>

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
Source§

impl<I, T, U> Upcast<I, U> for T
where U: UpcastFrom<I, T>,

Source§

fn upcast(self, interner: I) -> U

Source§

impl<I, T> UpcastFrom<I, T> for T

Source§

fn upcast_from(from: T, _tcx: I) -> T

Source§

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

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 40 bytes