Migrate "requires unsafe" diagnostics
This commit is contained in:
parent
71fe52fed0
commit
64f3e4f195
3 changed files with 432 additions and 96 deletions
|
@ -59,3 +59,113 @@ mir_build_unsafe_op_in_unsafe_fn_call_to_fn_with_requires_unsafe =
|
||||||
call to function `{$function}` with `#[target_feature]` is unsafe and requires unsafe block (error E0133)
|
call to function `{$function}` with `#[target_feature]` is unsafe and requires unsafe block (error E0133)
|
||||||
.note = can only be called if the required target features are available
|
.note = can only be called if the required target features are available
|
||||||
.label = call to function with `#[target_feature]`
|
.label = call to function with `#[target_feature]`
|
||||||
|
|
||||||
|
mir_build_call_to_unsafe_fn_requires_unsafe =
|
||||||
|
call to unsafe function `{$function}` is unsafe and requires unsafe block
|
||||||
|
.note = consult the function's documentation for information on how to avoid undefined behavior
|
||||||
|
.label = call to unsafe function
|
||||||
|
|
||||||
|
mir_build_call_to_unsafe_fn_requires_unsafe_nameless =
|
||||||
|
call to unsafe function is unsafe and requires unsafe block
|
||||||
|
.note = consult the function's documentation for information on how to avoid undefined behavior
|
||||||
|
.label = call to unsafe function
|
||||||
|
|
||||||
|
mir_build_call_to_unsafe_fn_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
||||||
|
call to unsafe function `{$function}` is unsafe and requires unsafe function or block
|
||||||
|
.note = consult the function's documentation for information on how to avoid undefined behavior
|
||||||
|
.label = call to unsafe function
|
||||||
|
|
||||||
|
mir_build_call_to_unsafe_fn_requires_unsafe_nameless_unsafe_op_in_unsafe_fn_allowed =
|
||||||
|
call to unsafe function is unsafe and requires unsafe function or block
|
||||||
|
.note = consult the function's documentation for information on how to avoid undefined behavior
|
||||||
|
.label = call to unsafe function
|
||||||
|
|
||||||
|
mir_build_inline_assembly_requires_unsafe =
|
||||||
|
use of inline assembly is unsafe and requires unsafe block
|
||||||
|
.note = inline assembly is entirely unchecked and can cause undefined behavior
|
||||||
|
.label = use of inline assembly
|
||||||
|
|
||||||
|
mir_build_inline_assembly_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
||||||
|
use of inline assembly is unsafe and requires unsafe function or block
|
||||||
|
.note = inline assembly is entirely unchecked and can cause undefined behavior
|
||||||
|
.label = use of inline assembly
|
||||||
|
|
||||||
|
mir_build_initializing_type_with_requires_unsafe =
|
||||||
|
initializing type with `rustc_layout_scalar_valid_range` attr is unsafe and requires unsafe block
|
||||||
|
.note = initializing a layout restricted type's field with a value outside the valid range is undefined behavior
|
||||||
|
.label = initializing type with `rustc_layout_scalar_valid_range` attr
|
||||||
|
|
||||||
|
mir_build_initializing_type_with_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
||||||
|
initializing type with `rustc_layout_scalar_valid_range` attr is unsafe and requires unsafe function or block
|
||||||
|
.note = initializing a layout restricted type's field with a value outside the valid range is undefined behavior
|
||||||
|
.label = initializing type with `rustc_layout_scalar_valid_range` attr
|
||||||
|
|
||||||
|
mir_build_mutable_static_requires_unsafe =
|
||||||
|
use of mutable static is unsafe and requires unsafe block
|
||||||
|
.note = mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior
|
||||||
|
.label = use of mutable static
|
||||||
|
|
||||||
|
mir_build_mutable_static_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
||||||
|
use of mutable static is unsafe and requires unsafe function or block
|
||||||
|
.note = mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior
|
||||||
|
.label = use of mutable static
|
||||||
|
|
||||||
|
mir_build_extern_static_requires_unsafe =
|
||||||
|
use of extern static is unsafe and requires unsafe block
|
||||||
|
.note = extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior
|
||||||
|
.label = use of extern static
|
||||||
|
|
||||||
|
mir_build_extern_static_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
||||||
|
use of extern static is unsafe and requires unsafe function or block
|
||||||
|
.note = extern statics are not controlled by the Rust type system: invalid data, aliasing violations or data races will cause undefined behavior
|
||||||
|
.label = use of extern static
|
||||||
|
|
||||||
|
mir_build_deref_raw_pointer_requires_unsafe =
|
||||||
|
dereference of raw pointer is unsafe and requires unsafe block
|
||||||
|
.note = raw pointers may be null, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior
|
||||||
|
.label = dereference of raw pointer
|
||||||
|
|
||||||
|
mir_build_deref_raw_pointer_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
||||||
|
dereference of raw pointer is unsafe and requires unsafe function or block
|
||||||
|
.note = raw pointers may be null, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior
|
||||||
|
.label = dereference of raw pointer
|
||||||
|
|
||||||
|
mir_build_union_field_requires_unsafe =
|
||||||
|
access to union field is unsafe and requires unsafe block
|
||||||
|
.note = the field may not be properly initialized: using uninitialized data will cause undefined behavior
|
||||||
|
.label = access to union field
|
||||||
|
|
||||||
|
mir_build_union_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
||||||
|
access to union field is unsafe and requires unsafe function or block
|
||||||
|
.note = the field may not be properly initialized: using uninitialized data will cause undefined behavior
|
||||||
|
.label = access to union field
|
||||||
|
|
||||||
|
mir_build_mutation_of_layout_constrained_field_requires_unsafe =
|
||||||
|
mutation of layout constrained field is unsafe and requires unsafe block
|
||||||
|
.note = mutating layout constrained fields cannot statically be checked for valid values
|
||||||
|
.label = mutation of layout constrained field
|
||||||
|
|
||||||
|
mir_build_mutation_of_layout_constrained_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
||||||
|
mutation of layout constrained field is unsafe and requires unsafe function or block
|
||||||
|
.note = mutating layout constrained fields cannot statically be checked for valid values
|
||||||
|
.label = mutation of layout constrained field
|
||||||
|
|
||||||
|
mir_build_borrow_of_layout_constrained_field_requires_unsafe =
|
||||||
|
borrow of layout constrained field with interior mutability is unsafe and requires unsafe block
|
||||||
|
.note = references to fields of layout constrained fields lose the constraints. Coupled with interior mutability, the field can be changed to invalid values
|
||||||
|
.label = borrow of layout constrained field with interior mutability
|
||||||
|
|
||||||
|
mir_build_borrow_of_layout_constrained_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
||||||
|
borrow of layout constrained field with interior mutability is unsafe and requires unsafe function or block
|
||||||
|
.note = references to fields of layout constrained fields lose the constraints. Coupled with interior mutability, the field can be changed to invalid values
|
||||||
|
.label = borrow of layout constrained field with interior mutability
|
||||||
|
|
||||||
|
mir_build_call_to_fn_with_requires_unsafe =
|
||||||
|
call to function `{$function}` with `#[target_feature]` is unsafe and requires unsafe block
|
||||||
|
.note = can only be called if the required target features are available
|
||||||
|
.label = call to function with `#[target_feature]`
|
||||||
|
|
||||||
|
mir_build_call_to_fn_with_requires_unsafe_unsafe_op_in_unsafe_fn_allowed =
|
||||||
|
call to function `{$function}` with `#[target_feature]` is unsafe and requires unsafe function or block
|
||||||
|
.note = can only be called if the required target features are available
|
||||||
|
.label = call to function with `#[target_feature]`
|
||||||
|
|
|
@ -2,7 +2,6 @@ use crate::build::ExprCategory;
|
||||||
use crate::errors::*;
|
use crate::errors::*;
|
||||||
use rustc_middle::thir::visit::{self, Visitor};
|
use rustc_middle::thir::visit::{self, Visitor};
|
||||||
|
|
||||||
use rustc_errors::struct_span_err;
|
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_middle::mir::BorrowKind;
|
use rustc_middle::mir::BorrowKind;
|
||||||
use rustc_middle::thir::*;
|
use rustc_middle::thir::*;
|
||||||
|
@ -13,7 +12,6 @@ use rustc_span::def_id::{DefId, LocalDefId};
|
||||||
use rustc_span::symbol::Symbol;
|
use rustc_span::symbol::Symbol;
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
use std::borrow::Cow;
|
|
||||||
use std::ops::Bound;
|
use std::ops::Bound;
|
||||||
|
|
||||||
struct UnsafetyVisitor<'a, 'tcx> {
|
struct UnsafetyVisitor<'a, 'tcx> {
|
||||||
|
@ -88,19 +86,7 @@ impl<'tcx> UnsafetyVisitor<'_, 'tcx> {
|
||||||
kind.emit_unsafe_op_in_unsafe_fn_lint(self.tcx, self.hir_context, span);
|
kind.emit_unsafe_op_in_unsafe_fn_lint(self.tcx, self.hir_context, span);
|
||||||
}
|
}
|
||||||
SafetyContext::Safe => {
|
SafetyContext::Safe => {
|
||||||
let (description, note) = kind.description_and_note(self.tcx);
|
kind.emit_requires_unsafe_err(self.tcx, span, unsafe_op_in_unsafe_fn_allowed);
|
||||||
let fn_sugg = if unsafe_op_in_unsafe_fn_allowed { " function or" } else { "" };
|
|
||||||
struct_span_err!(
|
|
||||||
self.tcx.sess,
|
|
||||||
span,
|
|
||||||
E0133,
|
|
||||||
"{} is unsafe and requires unsafe{} block",
|
|
||||||
description,
|
|
||||||
fn_sugg,
|
|
||||||
)
|
|
||||||
.span_label(span, kind.simple_description())
|
|
||||||
.note(note)
|
|
||||||
.emit();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -556,55 +542,55 @@ impl UnsafeOpKind {
|
||||||
UNSAFE_OP_IN_UNSAFE_FN,
|
UNSAFE_OP_IN_UNSAFE_FN,
|
||||||
hir_id,
|
hir_id,
|
||||||
span,
|
span,
|
||||||
UnsafeOpInUnsafeUseOfInlineAssemblyRequiresUnsafe { span },
|
UnsafeOpInUnsafeFnUseOfInlineAssemblyRequiresUnsafe { span },
|
||||||
),
|
),
|
||||||
InitializingTypeWith => tcx.emit_spanned_lint(
|
InitializingTypeWith => tcx.emit_spanned_lint(
|
||||||
UNSAFE_OP_IN_UNSAFE_FN,
|
UNSAFE_OP_IN_UNSAFE_FN,
|
||||||
hir_id,
|
hir_id,
|
||||||
span,
|
span,
|
||||||
UnsafeOpInUnsafeInitializingTypeWithRequiresUnsafe { span },
|
UnsafeOpInUnsafeFnInitializingTypeWithRequiresUnsafe { span },
|
||||||
),
|
),
|
||||||
UseOfMutableStatic => tcx.emit_spanned_lint(
|
UseOfMutableStatic => tcx.emit_spanned_lint(
|
||||||
UNSAFE_OP_IN_UNSAFE_FN,
|
UNSAFE_OP_IN_UNSAFE_FN,
|
||||||
hir_id,
|
hir_id,
|
||||||
span,
|
span,
|
||||||
UnsafeOpInUnsafeUseOfMutableStaticRequiresUnsafe { span },
|
UnsafeOpInUnsafeFnUseOfMutableStaticRequiresUnsafe { span },
|
||||||
),
|
),
|
||||||
UseOfExternStatic => tcx.emit_spanned_lint(
|
UseOfExternStatic => tcx.emit_spanned_lint(
|
||||||
UNSAFE_OP_IN_UNSAFE_FN,
|
UNSAFE_OP_IN_UNSAFE_FN,
|
||||||
hir_id,
|
hir_id,
|
||||||
span,
|
span,
|
||||||
UnsafeOpInUnsafeUseOfExternStaticRequiresUnsafe { span },
|
UnsafeOpInUnsafeFnUseOfExternStaticRequiresUnsafe { span },
|
||||||
),
|
),
|
||||||
DerefOfRawPointer => tcx.emit_spanned_lint(
|
DerefOfRawPointer => tcx.emit_spanned_lint(
|
||||||
UNSAFE_OP_IN_UNSAFE_FN,
|
UNSAFE_OP_IN_UNSAFE_FN,
|
||||||
hir_id,
|
hir_id,
|
||||||
span,
|
span,
|
||||||
UnsafeOpInUnsafeDerefOfRawPointerRequiresUnsafe { span },
|
UnsafeOpInUnsafeFnDerefOfRawPointerRequiresUnsafe { span },
|
||||||
),
|
),
|
||||||
AccessToUnionField => tcx.emit_spanned_lint(
|
AccessToUnionField => tcx.emit_spanned_lint(
|
||||||
UNSAFE_OP_IN_UNSAFE_FN,
|
UNSAFE_OP_IN_UNSAFE_FN,
|
||||||
hir_id,
|
hir_id,
|
||||||
span,
|
span,
|
||||||
UnsafeOpInUnsafeAccessToUnionFieldRequiresUnsafe { span },
|
UnsafeOpInUnsafeFnAccessToUnionFieldRequiresUnsafe { span },
|
||||||
),
|
),
|
||||||
MutationOfLayoutConstrainedField => tcx.emit_spanned_lint(
|
MutationOfLayoutConstrainedField => tcx.emit_spanned_lint(
|
||||||
UNSAFE_OP_IN_UNSAFE_FN,
|
UNSAFE_OP_IN_UNSAFE_FN,
|
||||||
hir_id,
|
hir_id,
|
||||||
span,
|
span,
|
||||||
UnsafeOpInUnsafeMutationOfLayoutConstrainedFieldRequiresUnsafe { span },
|
UnsafeOpInUnsafeFnMutationOfLayoutConstrainedFieldRequiresUnsafe { span },
|
||||||
),
|
),
|
||||||
BorrowOfLayoutConstrainedField => tcx.emit_spanned_lint(
|
BorrowOfLayoutConstrainedField => tcx.emit_spanned_lint(
|
||||||
UNSAFE_OP_IN_UNSAFE_FN,
|
UNSAFE_OP_IN_UNSAFE_FN,
|
||||||
hir_id,
|
hir_id,
|
||||||
span,
|
span,
|
||||||
UnsafeOpInUnsafeBorrowOfLayoutConstrainedFieldRequiresUnsafe { span },
|
UnsafeOpInUnsafeFnBorrowOfLayoutConstrainedFieldRequiresUnsafe { span },
|
||||||
),
|
),
|
||||||
CallToFunctionWith(did) => tcx.emit_spanned_lint(
|
CallToFunctionWith(did) => tcx.emit_spanned_lint(
|
||||||
UNSAFE_OP_IN_UNSAFE_FN,
|
UNSAFE_OP_IN_UNSAFE_FN,
|
||||||
hir_id,
|
hir_id,
|
||||||
span,
|
span,
|
||||||
UnsafeOpInUnsafeCallToFunctionWithRequiresUnsafe {
|
UnsafeOpInUnsafeFnCallToFunctionWithRequiresUnsafe {
|
||||||
span,
|
span,
|
||||||
function: &tcx.def_path_str(*did),
|
function: &tcx.def_path_str(*did),
|
||||||
},
|
},
|
||||||
|
@ -612,79 +598,105 @@ impl UnsafeOpKind {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn simple_description(&self) -> &'static str {
|
pub fn emit_requires_unsafe_err(
|
||||||
|
&self,
|
||||||
|
tcx: TyCtxt<'_>,
|
||||||
|
span: Span,
|
||||||
|
unsafe_op_in_unsafe_fn_allowed: bool,
|
||||||
|
) {
|
||||||
match self {
|
match self {
|
||||||
CallToUnsafeFunction(..) => "call to unsafe function",
|
CallToUnsafeFunction(did) if did.is_some() && unsafe_op_in_unsafe_fn_allowed => {
|
||||||
UseOfInlineAssembly => "use of inline assembly",
|
tcx.sess.emit_err(CallToUnsafeFunctionRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
|
||||||
InitializingTypeWith => "initializing type with `rustc_layout_scalar_valid_range` attr",
|
span,
|
||||||
UseOfMutableStatic => "use of mutable static",
|
function: &tcx.def_path_str(did.unwrap()),
|
||||||
UseOfExternStatic => "use of extern static",
|
});
|
||||||
DerefOfRawPointer => "dereference of raw pointer",
|
}
|
||||||
AccessToUnionField => "access to union field",
|
CallToUnsafeFunction(did) if did.is_some() => {
|
||||||
MutationOfLayoutConstrainedField => "mutation of layout constrained field",
|
tcx.sess.emit_err(CallToUnsafeFunctionRequiresUnsafe {
|
||||||
BorrowOfLayoutConstrainedField => {
|
span,
|
||||||
"borrow of layout constrained field with interior mutability"
|
function: &tcx.def_path_str(did.unwrap()),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
CallToUnsafeFunction(..) if unsafe_op_in_unsafe_fn_allowed => {
|
||||||
|
tcx.sess.emit_err(
|
||||||
|
CallToUnsafeFunctionRequiresUnsafeNamelessUnsafeOpInUnsafeFnAllowed { span },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
CallToUnsafeFunction(..) => {
|
||||||
|
tcx.sess.emit_err(CallToUnsafeFunctionRequiresUnsafeNameless { span });
|
||||||
|
}
|
||||||
|
UseOfInlineAssembly if unsafe_op_in_unsafe_fn_allowed => {
|
||||||
|
tcx.sess
|
||||||
|
.emit_err(UseOfInlineAssemblyRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span });
|
||||||
|
}
|
||||||
|
UseOfInlineAssembly => {
|
||||||
|
tcx.sess.emit_err(UseOfInlineAssemblyRequiresUnsafe { span });
|
||||||
|
}
|
||||||
|
InitializingTypeWith if unsafe_op_in_unsafe_fn_allowed => {
|
||||||
|
tcx.sess
|
||||||
|
.emit_err(InitializingTypeWithRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span });
|
||||||
|
}
|
||||||
|
InitializingTypeWith => {
|
||||||
|
tcx.sess.emit_err(InitializingTypeWithRequiresUnsafe { span });
|
||||||
|
}
|
||||||
|
UseOfMutableStatic if unsafe_op_in_unsafe_fn_allowed => {
|
||||||
|
tcx.sess
|
||||||
|
.emit_err(UseOfMutableStaticRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span });
|
||||||
|
}
|
||||||
|
UseOfMutableStatic => {
|
||||||
|
tcx.sess.emit_err(UseOfMutableStaticRequiresUnsafe { span });
|
||||||
|
}
|
||||||
|
UseOfExternStatic if unsafe_op_in_unsafe_fn_allowed => {
|
||||||
|
tcx.sess
|
||||||
|
.emit_err(UseOfExternStaticRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span });
|
||||||
|
}
|
||||||
|
UseOfExternStatic => {
|
||||||
|
tcx.sess.emit_err(UseOfExternStaticRequiresUnsafe { span });
|
||||||
|
}
|
||||||
|
DerefOfRawPointer if unsafe_op_in_unsafe_fn_allowed => {
|
||||||
|
tcx.sess
|
||||||
|
.emit_err(DerefOfRawPointerRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span });
|
||||||
|
}
|
||||||
|
DerefOfRawPointer => {
|
||||||
|
tcx.sess.emit_err(DerefOfRawPointerRequiresUnsafe { span });
|
||||||
|
}
|
||||||
|
AccessToUnionField if unsafe_op_in_unsafe_fn_allowed => {
|
||||||
|
tcx.sess
|
||||||
|
.emit_err(AccessToUnionFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span });
|
||||||
|
}
|
||||||
|
AccessToUnionField => {
|
||||||
|
tcx.sess.emit_err(AccessToUnionFieldRequiresUnsafe { span });
|
||||||
|
}
|
||||||
|
MutationOfLayoutConstrainedField if unsafe_op_in_unsafe_fn_allowed => {
|
||||||
|
tcx.sess.emit_err(
|
||||||
|
MutationOfLayoutConstrainedFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
|
||||||
|
span,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
MutationOfLayoutConstrainedField => {
|
||||||
|
tcx.sess.emit_err(MutationOfLayoutConstrainedFieldRequiresUnsafe { span });
|
||||||
|
}
|
||||||
|
BorrowOfLayoutConstrainedField if unsafe_op_in_unsafe_fn_allowed => {
|
||||||
|
tcx.sess.emit_err(
|
||||||
|
BorrowOfLayoutConstrainedFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
BorrowOfLayoutConstrainedField => {
|
||||||
|
tcx.sess.emit_err(BorrowOfLayoutConstrainedFieldRequiresUnsafe { span });
|
||||||
|
}
|
||||||
|
CallToFunctionWith(did) if unsafe_op_in_unsafe_fn_allowed => {
|
||||||
|
tcx.sess.emit_err(CallToFunctionWithRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
|
||||||
|
span,
|
||||||
|
function: &tcx.def_path_str(*did),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
CallToFunctionWith(did) => {
|
||||||
|
tcx.sess.emit_err(CallToFunctionWithRequiresUnsafe {
|
||||||
|
span,
|
||||||
|
function: &tcx.def_path_str(*did),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
CallToFunctionWith(..) => "call to function with `#[target_feature]`",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn description_and_note(&self, tcx: TyCtxt<'_>) -> (Cow<'static, str>, &'static str) {
|
|
||||||
match self {
|
|
||||||
CallToUnsafeFunction(did) => (
|
|
||||||
if let Some(did) = did {
|
|
||||||
Cow::from(format!("call to unsafe function `{}`", tcx.def_path_str(*did)))
|
|
||||||
} else {
|
|
||||||
Cow::Borrowed(self.simple_description())
|
|
||||||
},
|
|
||||||
"consult the function's documentation for information on how to avoid undefined \
|
|
||||||
behavior",
|
|
||||||
),
|
|
||||||
UseOfInlineAssembly => (
|
|
||||||
Cow::Borrowed(self.simple_description()),
|
|
||||||
"inline assembly is entirely unchecked and can cause undefined behavior",
|
|
||||||
),
|
|
||||||
InitializingTypeWith => (
|
|
||||||
Cow::Borrowed(self.simple_description()),
|
|
||||||
"initializing a layout restricted type's field with a value outside the valid \
|
|
||||||
range is undefined behavior",
|
|
||||||
),
|
|
||||||
UseOfMutableStatic => (
|
|
||||||
Cow::Borrowed(self.simple_description()),
|
|
||||||
"mutable statics can be mutated by multiple threads: aliasing violations or data \
|
|
||||||
races will cause undefined behavior",
|
|
||||||
),
|
|
||||||
UseOfExternStatic => (
|
|
||||||
Cow::Borrowed(self.simple_description()),
|
|
||||||
"extern statics are not controlled by the Rust type system: invalid data, \
|
|
||||||
aliasing violations or data races will cause undefined behavior",
|
|
||||||
),
|
|
||||||
DerefOfRawPointer => (
|
|
||||||
Cow::Borrowed(self.simple_description()),
|
|
||||||
"raw pointers may be null, dangling or unaligned; they can violate aliasing rules \
|
|
||||||
and cause data races: all of these are undefined behavior",
|
|
||||||
),
|
|
||||||
AccessToUnionField => (
|
|
||||||
Cow::Borrowed(self.simple_description()),
|
|
||||||
"the field may not be properly initialized: using uninitialized data will cause \
|
|
||||||
undefined behavior",
|
|
||||||
),
|
|
||||||
MutationOfLayoutConstrainedField => (
|
|
||||||
Cow::Borrowed(self.simple_description()),
|
|
||||||
"mutating layout constrained fields cannot statically be checked for valid values",
|
|
||||||
),
|
|
||||||
BorrowOfLayoutConstrainedField => (
|
|
||||||
Cow::Borrowed(self.simple_description()),
|
|
||||||
"references to fields of layout constrained fields lose the constraints. Coupled \
|
|
||||||
with interior mutability, the field can be changed to invalid values",
|
|
||||||
),
|
|
||||||
CallToFunctionWith(did) => (
|
|
||||||
Cow::from(format!(
|
|
||||||
"call to function `{}` with `#[target_feature]`",
|
|
||||||
tcx.def_path_str(*did)
|
|
||||||
)),
|
|
||||||
"can only be called if the required target features are available",
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use rustc_macros::LintDiagnostic;
|
use rustc_macros::{LintDiagnostic, SessionDiagnostic};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
#[derive(LintDiagnostic)]
|
#[derive(LintDiagnostic)]
|
||||||
|
@ -99,3 +99,217 @@ pub struct UnsafeOpInUnsafeFnCallToFunctionWithRequiresUnsafe<'a> {
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
pub function: &'a str,
|
pub function: &'a str,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::call_to_unsafe_fn_requires_unsafe, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct CallToUnsafeFunctionRequiresUnsafe<'a> {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
pub function: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::call_to_unsafe_fn_requires_unsafe_nameless, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct CallToUnsafeFunctionRequiresUnsafeNameless {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::call_to_unsafe_fn_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct CallToUnsafeFunctionRequiresUnsafeUnsafeOpInUnsafeFnAllowed<'a> {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
pub function: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(
|
||||||
|
mir_build::call_to_unsafe_fn_requires_unsafe_nameless_unsafe_op_in_unsafe_fn_allowed,
|
||||||
|
code = "E0133"
|
||||||
|
)]
|
||||||
|
#[note]
|
||||||
|
pub struct CallToUnsafeFunctionRequiresUnsafeNamelessUnsafeOpInUnsafeFnAllowed {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::inline_assembly_requires_unsafe, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct UseOfInlineAssemblyRequiresUnsafe {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::inline_assembly_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct UseOfInlineAssemblyRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::initializing_type_with_requires_unsafe, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct InitializingTypeWithRequiresUnsafe {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(
|
||||||
|
mir_build::initializing_type_with_requires_unsafe_unsafe_op_in_unsafe_fn_allowed,
|
||||||
|
code = "E0133"
|
||||||
|
)]
|
||||||
|
#[note]
|
||||||
|
pub struct InitializingTypeWithRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::mutable_static_requires_unsafe, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct UseOfMutableStaticRequiresUnsafe {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::mutable_static_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct UseOfMutableStaticRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::extern_static_requires_unsafe, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct UseOfExternStaticRequiresUnsafe {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::extern_static_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct UseOfExternStaticRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::deref_raw_pointer_requires_unsafe, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct DerefOfRawPointerRequiresUnsafe {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::deref_raw_pointer_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct DerefOfRawPointerRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::union_field_requires_unsafe, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct AccessToUnionFieldRequiresUnsafe {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::union_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct AccessToUnionFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::mutation_of_layout_constrained_field_requires_unsafe, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct MutationOfLayoutConstrainedFieldRequiresUnsafe {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(
|
||||||
|
mir_build::mutation_of_layout_constrained_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed,
|
||||||
|
code = "E0133"
|
||||||
|
)]
|
||||||
|
#[note]
|
||||||
|
pub struct MutationOfLayoutConstrainedFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::borrow_of_layout_constrained_field_requires_unsafe, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct BorrowOfLayoutConstrainedFieldRequiresUnsafe {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(
|
||||||
|
mir_build::borrow_of_layout_constrained_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed,
|
||||||
|
code = "E0133"
|
||||||
|
)]
|
||||||
|
#[note]
|
||||||
|
pub struct BorrowOfLayoutConstrainedFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::call_to_fn_with_requires_unsafe, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct CallToFunctionWithRequiresUnsafe<'a> {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
pub function: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[diag(mir_build::call_to_fn_with_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
|
||||||
|
#[note]
|
||||||
|
pub struct CallToFunctionWithRequiresUnsafeUnsafeOpInUnsafeFnAllowed<'a> {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
pub function: &'a str,
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue