Skip to content

Add recursion limit to FFI safety lint #130598

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 1 commit into from
Sep 21, 2024

Conversation

gurry
Copy link
Contributor

@gurry gurry commented Sep 20, 2024

Fixes #130310

Now we check against tcx.recursion_limit() and raise an error if it the limit is reached instead of overflowing the stack.

@rustbot
Copy link
Collaborator

rustbot commented Sep 20, 2024

r? @petrochenkov

rustbot has assigned @petrochenkov.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Sep 20, 2024
@gurry gurry force-pushed the 130310-improper-types-stack-overflow branch from 1a4286d to 8ea1a53 Compare September 20, 2024 08:10
@@ -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 });
Copy link
Member

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"

Copy link
Contributor Author

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.

Copy link
Contributor Author

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
@gurry gurry force-pushed the 130310-improper-types-stack-overflow branch from 8ea1a53 to 7160447 Compare September 20, 2024 13:32
@petrochenkov
Copy link
Contributor

r? @compiler-errors

@compiler-errors
Copy link
Member

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

@bors
Copy link
Collaborator

bors commented Sep 21, 2024

📌 Commit 7160447 has been approved by compiler-errors

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Sep 21, 2024
bors added a commit to rust-lang-ci/rust that referenced this pull request Sep 21, 2024
…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
@bors bors merged commit 28ace83 into rust-lang:master Sep 21, 2024
6 checks passed
@rustbot rustbot added this to the 1.83.0 milestone Sep 21, 2024
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Sep 21, 2024
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.
@gurry gurry deleted the 130310-improper-types-stack-overflow branch September 21, 2024 09:25
@jieyouxu jieyouxu added the L-improper_ctypes Lint: improper_ctypes label Sep 23, 2024
};
}

acc.recursion_depth += 1;
Copy link
Member

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.

compiler-errors added a commit to compiler-errors/rust that referenced this pull request Sep 24, 2024
…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
compiler-errors added a commit to compiler-errors/rust that referenced this pull request Sep 24, 2024
…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
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Sep 24, 2024
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
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
L-improper_ctypes Lint: improper_ctypes S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

stack overflow in ImproperCTypesVisitor::{check_type_for_ffi, check_variant_for_ffi}
7 participants