-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add recursion limit to FFI safety lint #130598
Add recursion limit to FFI safety lint #130598
Conversation
rustbot has assigned @petrochenkov. Use |
1a4286d
to
8ea1a53
Compare
compiler/rustc_lint/src/types.rs
Outdated
@@ -1658,6 +1670,9 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { | |||
FfiResult::FfiUnsafe { ty, reason, help } => { | |||
self.emit_ffi_unsafe_type_lint(ty, sp, reason, help); | |||
} | |||
FfiResult::RecursionLimitReached => { | |||
self.cx.tcx.dcx().emit_err(RecursionLimitReached { ty, span: sp }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This shouldn't be a recursion limit error. It should probably be under the same FFI-unsafety warning but with adjusted wording like "couldn't determine if infinitely recursive type is FFI safe"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wasn't myself sure whether to go with the warning or the error. Let me change it to a warning then.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
Fixes stack overflow in the case of recursive types
8ea1a53
to
7160447
Compare
It's not totally correct that the type is infinitely recursive; it might just be very large. But whatever, I think having a wrong error message is better than a stack overflow. @bors r+ rollup |
…iaskrgr Rollup of 6 pull requests Successful merges: - rust-lang#129718 (add guarantee about remove_dir and remove_file error kinds) - rust-lang#130598 (Add recursion limit to FFI safety lint) - rust-lang#130642 (Pass the current cargo to `run-make` tests) - rust-lang#130644 (Only expect valtree consts in codegen) - rust-lang#130645 (Normalize consts in writeback when GCE is enabled) - rust-lang#130646 (compiler: factor out `OVERFLOWING_LITERALS` impl) r? `@ghost` `@rustbot` modify labels: rollup
Rollup merge of rust-lang#130598 - gurry:130310-improper-types-stack-overflow, r=compiler-errors Add recursion limit to FFI safety lint Fixes rust-lang#130310 Now we check against `tcx.recursion_limit()` and raise an error if it the limit is reached instead of overflowing the stack.
}; | ||
} | ||
|
||
acc.recursion_depth += 1; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This was never being decremented.
…mit, r=jieyouxu Revert "Add recursion limit to FFI safety lint" It's not necessarily clear if warning when we hit the recursion limit is the right thing to do, first of all. **More importantly**, this PR was implemented incorrectly in the first place; it was not decrementing the recursion limit when stepping out of a type, so it would trigger when a ctype has more than RECURSION_LIMIT fields *anywhere* in the type's set of recursively reachable fields. Reverts rust-lang#130598 Reopens rust-lang#130310 Fixes rust-lang#130757
…mit, r=jieyouxu Revert "Add recursion limit to FFI safety lint" It's not necessarily clear if warning when we hit the recursion limit is the right thing to do, first of all. **More importantly**, this PR was implemented incorrectly in the first place; it was not decrementing the recursion limit when stepping out of a type, so it would trigger when a ctype has more than RECURSION_LIMIT fields *anywhere* in the type's set of recursively reachable fields. Reverts rust-lang#130598 Reopens rust-lang#130310 Fixes rust-lang#130757
Rollup merge of rust-lang#130758 - compiler-errors:ctype-recursion-limit, r=jieyouxu Revert "Add recursion limit to FFI safety lint" It's not necessarily clear if warning when we hit the recursion limit is the right thing to do, first of all. **More importantly**, this PR was implemented incorrectly in the first place; it was not decrementing the recursion limit when stepping out of a type, so it would trigger when a ctype has more than RECURSION_LIMIT fields *anywhere* in the type's set of recursively reachable fields. Reverts rust-lang#130598 Reopens rust-lang#130310 Fixes rust-lang#130757
Fixes #130310
Now we check against
tcx.recursion_limit()
and raise an error if it the limit is reached instead of overflowing the stack.