Enum rustc_middle::mir::interpret::UndefinedBehaviorInfo
source · pub enum UndefinedBehaviorInfo<'tcx> {
Show 36 variants
Ub(String),
Custom(CustomSubdiagnostic<'tcx>),
ValidationError(ValidationErrorInfo<'tcx>),
Unreachable,
BoundsCheckFailed {
len: u64,
index: u64,
},
DivisionByZero,
RemainderByZero,
DivisionOverflow,
RemainderOverflow,
PointerArithOverflow,
ArithOverflow {
intrinsic: Symbol,
},
ShiftOverflow {
intrinsic: Symbol,
shift_amount: Either<u128, i128>,
},
InvalidMeta(InvalidMetaKind),
UnterminatedCString(Pointer<AllocId>),
PointerUseAfterFree(AllocId, CheckInAllocMsg),
PointerOutOfBounds {
alloc_id: AllocId,
alloc_size: Size,
ptr_offset: i64,
inbounds_size: i64,
msg: CheckInAllocMsg,
},
DanglingIntPointer {
addr: u64,
inbounds_size: i64,
msg: CheckInAllocMsg,
},
AlignmentCheckFailed(Misalignment, CheckAlignMsg),
WriteToReadOnly(AllocId),
DerefFunctionPointer(AllocId),
DerefVTablePointer(AllocId),
InvalidBool(u8),
InvalidChar(u32),
InvalidTag(Scalar<AllocId>),
InvalidFunctionPointer(Pointer<AllocId>),
InvalidVTablePointer(Pointer<AllocId>),
InvalidVTableTrait {
expected_trait: &'tcx List<PolyExistentialPredicate<'tcx>>,
vtable_trait: Option<PolyExistentialTraitRef<'tcx>>,
},
InvalidStr(Utf8Error),
InvalidUninitBytes(Option<(AllocId, BadBytesAccess)>),
DeadLocal,
ScalarSizeMismatch(ScalarSizeMismatch),
UninhabitedEnumVariantWritten(VariantIdx),
UninhabitedEnumVariantRead(VariantIdx),
InvalidNichedEnumVariantWritten {
enum_ty: Ty<'tcx>,
},
AbiMismatchArgument {
caller_ty: Ty<'tcx>,
callee_ty: Ty<'tcx>,
},
AbiMismatchReturn {
caller_ty: Ty<'tcx>,
callee_ty: Ty<'tcx>,
},
}
Expand description
Error information for when the program caused Undefined Behavior.
Variants§
Ub(String)
Free-form case. Only for errors that are never caught! Used by miri
Custom(CustomSubdiagnostic<'tcx>)
A custom (free-form) fluent-translated error, created by err_ub_custom!
.
ValidationError(ValidationErrorInfo<'tcx>)
Validation error.
Unreachable
Unreachable code was executed.
BoundsCheckFailed
A slice/array index projection went out-of-bounds.
DivisionByZero
Something was divided by 0 (x / 0).
RemainderByZero
Something was “remainded” by 0 (x % 0).
DivisionOverflow
Signed division overflowed (INT_MIN / -1).
RemainderOverflow
Signed remainder overflowed (INT_MIN % -1).
PointerArithOverflow
Overflowing inbounds pointer arithmetic.
ArithOverflow
Overflow in arithmetic that may not overflow.
ShiftOverflow
Shift by too much.
InvalidMeta(InvalidMetaKind)
Invalid metadata in a wide pointer
UnterminatedCString(Pointer<AllocId>)
Reading a C string that does not end within its allocation.
PointerUseAfterFree(AllocId, CheckInAllocMsg)
Using a pointer after it got freed.
PointerOutOfBounds
Used a pointer outside the bounds it is valid for.
Fields
msg: CheckInAllocMsg
DanglingIntPointer
Using an integer as a pointer in the wrong way.
Fields
inbounds_size: i64
The size of the memory range that was expected to be in-bounds (or 0 if we need an allocation but not any actual memory there, e.g. for function pointers).
msg: CheckInAllocMsg
AlignmentCheckFailed(Misalignment, CheckAlignMsg)
Used a pointer with bad alignment.
WriteToReadOnly(AllocId)
Writing to read-only memory.
DerefFunctionPointer(AllocId)
Trying to access the data behind a function pointer.
DerefVTablePointer(AllocId)
Trying to access the data behind a vtable pointer.
InvalidBool(u8)
Using a non-boolean u8
as bool.
InvalidChar(u32)
Using a non-character u32
as character.
InvalidTag(Scalar<AllocId>)
The tag of an enum does not encode an actual discriminant.
InvalidFunctionPointer(Pointer<AllocId>)
Using a pointer-not-to-a-function as function pointer.
InvalidVTablePointer(Pointer<AllocId>)
Using a pointer-not-to-a-vtable as vtable pointer.
InvalidVTableTrait
Using a vtable for the wrong trait.
Fields
expected_trait: &'tcx List<PolyExistentialPredicate<'tcx>>
vtable_trait: Option<PolyExistentialTraitRef<'tcx>>
InvalidStr(Utf8Error)
Using a string that is not valid UTF-8,
InvalidUninitBytes(Option<(AllocId, BadBytesAccess)>)
Using uninitialized data where it is not allowed.
DeadLocal
Working with a local that is not currently live.
ScalarSizeMismatch(ScalarSizeMismatch)
Data size is not equal to target size.
UninhabitedEnumVariantWritten(VariantIdx)
A discriminant of an uninhabited enum variant is written.
UninhabitedEnumVariantRead(VariantIdx)
An uninhabited enum variant is projected.
InvalidNichedEnumVariantWritten
Trying to set discriminant to the niched variant, but the value does not match.
AbiMismatchArgument
ABI-incompatible argument types.
AbiMismatchReturn
ABI-incompatible return types.
Trait Implementations§
Auto Trait Implementations§
impl<'tcx> Freeze for UndefinedBehaviorInfo<'tcx>
impl<'tcx> !RefUnwindSafe for UndefinedBehaviorInfo<'tcx>
impl<'tcx> !Send for UndefinedBehaviorInfo<'tcx>
impl<'tcx> !Sync for UndefinedBehaviorInfo<'tcx>
impl<'tcx> Unpin for UndefinedBehaviorInfo<'tcx>
impl<'tcx> !UnwindSafe for UndefinedBehaviorInfo<'tcx>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
source§impl<T> Filterable for T
impl<T> Filterable for T
source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moresource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
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: 112 bytes
Size for each variant:
Ub
: 24 bytesCustom
: 24 bytesValidationError
: 112 bytesUnreachable
: 0 bytesBoundsCheckFailed
: 16 bytesDivisionByZero
: 0 bytesRemainderByZero
: 0 bytesDivisionOverflow
: 0 bytesRemainderOverflow
: 0 bytesPointerArithOverflow
: 0 bytesArithOverflow
: 4 bytesShiftOverflow
: 48 bytesInvalidMeta
: 1 byteUnterminatedCString
: 16 bytesPointerUseAfterFree
: 16 bytesPointerOutOfBounds
: 40 bytesDanglingIntPointer
: 24 bytesAlignmentCheckFailed
: 3 bytesWriteToReadOnly
: 8 bytesDerefFunctionPointer
: 8 bytesDerefVTablePointer
: 8 bytesInvalidBool
: 1 byteInvalidChar
: 4 bytesInvalidTag
: 24 bytesInvalidFunctionPointer
: 16 bytesInvalidVTablePointer
: 16 bytesInvalidVTableTrait
: 32 bytesInvalidStr
: 16 bytesInvalidUninitBytes
: 40 bytesDeadLocal
: 0 bytesScalarSizeMismatch
: 16 bytesUninhabitedEnumVariantWritten
: 4 bytesUninhabitedEnumVariantRead
: 4 bytesInvalidNichedEnumVariantWritten
: 8 bytesAbiMismatchArgument
: 16 bytesAbiMismatchReturn
: 16 bytes