Revert "Add recursion limit to FFI safety lint"
This reverts commit 716044751b
.
This commit is contained in:
parent
702987f75b
commit
de66639bbc
5 changed files with 18 additions and 50 deletions
|
@ -395,8 +395,6 @@ lint_improper_ctypes_opaque = opaque types have no C equivalent
|
||||||
lint_improper_ctypes_pat_help = consider using the base type instead
|
lint_improper_ctypes_pat_help = consider using the base type instead
|
||||||
|
|
||||||
lint_improper_ctypes_pat_reason = pattern types have no C equivalent
|
lint_improper_ctypes_pat_reason = pattern types have no C equivalent
|
||||||
|
|
||||||
lint_improper_ctypes_recursion_limit_reached = type is infinitely recursive
|
|
||||||
lint_improper_ctypes_slice_help = consider using a raw pointer instead
|
lint_improper_ctypes_slice_help = consider using a raw pointer instead
|
||||||
|
|
||||||
lint_improper_ctypes_slice_reason = slices have no C equivalent
|
lint_improper_ctypes_slice_reason = slices have no C equivalent
|
||||||
|
|
|
@ -592,8 +592,6 @@ struct CTypesVisitorState<'tcx> {
|
||||||
/// The original type being checked, before we recursed
|
/// The original type being checked, before we recursed
|
||||||
/// to any other types it contains.
|
/// to any other types it contains.
|
||||||
base_ty: Ty<'tcx>,
|
base_ty: Ty<'tcx>,
|
||||||
/// Number of times we recursed while checking the type
|
|
||||||
recursion_depth: usize,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum FfiResult<'tcx> {
|
enum FfiResult<'tcx> {
|
||||||
|
@ -899,23 +897,12 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
||||||
|
|
||||||
// Protect against infinite recursion, for example
|
// Protect against infinite recursion, for example
|
||||||
// `struct S(*mut S);`.
|
// `struct S(*mut S);`.
|
||||||
|
// FIXME: A recursion limit is necessary as well, for irregular
|
||||||
|
// recursive types.
|
||||||
if !acc.cache.insert(ty) {
|
if !acc.cache.insert(ty) {
|
||||||
return FfiSafe;
|
return FfiSafe;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Additional recursion check for more complex types like
|
|
||||||
// `struct A<T> { v: *const A<A<T>>, ... }` for which the
|
|
||||||
// cache check above won't be enough (fixes #130310)
|
|
||||||
if !tcx.recursion_limit().value_within_limit(acc.recursion_depth) {
|
|
||||||
return FfiUnsafe {
|
|
||||||
ty: acc.base_ty,
|
|
||||||
reason: fluent::lint_improper_ctypes_recursion_limit_reached,
|
|
||||||
help: None,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
acc.recursion_depth += 1;
|
|
||||||
|
|
||||||
match *ty.kind() {
|
match *ty.kind() {
|
||||||
ty::Adt(def, args) => {
|
ty::Adt(def, args) => {
|
||||||
if let Some(boxed) = ty.boxed_ty()
|
if let Some(boxed) = ty.boxed_ty()
|
||||||
|
@ -1261,8 +1248,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut acc =
|
let mut acc = CTypesVisitorState { cache: FxHashSet::default(), base_ty: ty };
|
||||||
CTypesVisitorState { cache: FxHashSet::default(), base_ty: ty, recursion_depth: 0 };
|
|
||||||
match self.check_type_for_ffi(&mut acc, ty) {
|
match self.check_type_for_ffi(&mut acc, ty) {
|
||||||
FfiResult::FfiSafe => {}
|
FfiResult::FfiSafe => {}
|
||||||
FfiResult::FfiPhantom(ty) => {
|
FfiResult::FfiPhantom(ty) => {
|
||||||
|
|
15
tests/crashes/130310.rs
Normal file
15
tests/crashes/130310.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
//@ known-bug: rust-lang/rust#130310
|
||||||
|
|
||||||
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
struct A<T> {
|
||||||
|
a: *const A<A<T>>,
|
||||||
|
p: PhantomData<T>,
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
fn f(a: *const A<()>);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -1,20 +0,0 @@
|
||||||
// Regression test for #130310
|
|
||||||
// Tests that we do not fall into infinite
|
|
||||||
// recursion while checking FFI safety of
|
|
||||||
// recursive types like `A<T>` below
|
|
||||||
|
|
||||||
//@ build-pass
|
|
||||||
use std::marker::PhantomData;
|
|
||||||
|
|
||||||
#[repr(C)]
|
|
||||||
struct A<T> {
|
|
||||||
a: *const A<A<T>>, // Recursive because of this field
|
|
||||||
p: PhantomData<T>,
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
fn f(a: *const A<()>);
|
|
||||||
//~^ WARN `extern` block uses type `*const A<()>`, which is not FFI-safe
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
|
|
@ -1,11 +0,0 @@
|
||||||
warning: `extern` block uses type `*const A<()>`, which is not FFI-safe
|
|
||||||
--> $DIR/improper-types-stack-overflow-130310.rs:16:13
|
|
||||||
|
|
|
||||||
LL | fn f(a: *const A<()>);
|
|
||||||
| ^^^^^^^^^^^^ not FFI-safe
|
|
||||||
|
|
|
||||||
= note: type is infinitely recursive
|
|
||||||
= note: `#[warn(improper_ctypes)]` on by default
|
|
||||||
|
|
||||||
warning: 1 warning emitted
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue