Skip to content
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

Handle field projections like slice indexing in invalid_reference_casting #124908

Merged

Conversation

saethlin
Copy link
Member

@saethlin saethlin commented May 8, 2024

r? @Urgau

I saw the implementation in #124761, and I was wondering if we also need to handle field access. We do. Without this PR, we get this errant diagnostic:

error: casting references to a bigger memory layout than the backing allocation is undefined behavior, even if the reference is unused                                                                                
  --> /home/ben/rust/tests/ui/lint/reference_casting.rs:262:18                                                                                                                                                        
   |                                                                                                       
LL |         let r = &mut v.0;
   |                      --- backing allocation comes from here                                        
LL |         let ptr = r as *mut i32 as *mut Vec3<i32>;            
   |                   ------------------------------- casting happend here                                
LL |         unsafe { *ptr = Vec3(0, 0, 0) }                                                               
   |                  ^^^^^^^^^^^^^^^^^^^^                                                                 
   |                                                                                                       
   = note: casting from `i32` (4 bytes) to `Vec3<i32>` (12 bytes)     

@rustbot
Copy link
Collaborator

rustbot commented May 8, 2024

Failed to set assignee to Urgau: invalid assignee

Note: Only org members with at least the repository "read" role, users with write permissions, or people who have commented on the PR may be assigned.

@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 May 8, 2024
@saethlin
Copy link
Member Author

saethlin commented May 8, 2024

Oh, that's unfortunate.

r? compiler

Copy link
Member

@Urgau Urgau left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks go to me. Thanks.

@Urgau
Copy link
Member

Urgau commented May 8, 2024

When authoring #124761, I looked at every other ExprKind to see if I didn't missed another kind but found nothing suspicious, turn-out I did miss one, thanks for finding this one @saethlin.

Regarding the implementation, I wonder if we should turn the check into a allow instead of a disallow, that would avoid such issue in the future with new syntax or edge cases we have not yet found. Just an idea.

@saethlin
Copy link
Member Author

saethlin commented May 8, 2024

Regarding the implementation, I wonder if we should turn the check into a allow instead of a disallow

This is a really good question. I've started doing a local crater run to look for other issues. Right now I'm leaning towards agreeing that we should invert the logic instead of trying to find all the cases where we need to bail. I'll try to post some kind of summarization of what I'm finding.

Is there a tracking issue for this lint? I feel like at this point it should have one, and a quick search for the lint name didn't find one.

@fee1-dead
Copy link
Member

@bors r+ rollup

@bors
Copy link
Contributor

bors commented May 9, 2024

📌 Commit 0ca1a94 has been approved by fee1-dead

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 May 9, 2024
bors added a commit to rust-lang-ci/rust that referenced this pull request May 9, 2024
…iaskrgr

Rollup of 4 pull requests

Successful merges:

 - rust-lang#124777 (Fix Error Messages for `break` Inside Coroutines)
 - rust-lang#124837 (Migrate `run-make/rustdoc-map-file` to rmake)
 - rust-lang#124875 (Fix more ICEs in `diagnostic::on_unimplemented`)
 - rust-lang#124908 (Handle field projections like slice indexing in invalid_reference_casting)

r? `@ghost`
`@rustbot` modify labels: rollup
@Urgau
Copy link
Member

Urgau commented May 9, 2024

Regarding the implementation, I wonder if we should turn the check into a allow instead of a disallow

This is a really good question. I've started doing a local crater run to look for other issues. Right now I'm leaning towards agreeing that we should invert the logic instead of trying to find all the cases where we need to bail. I'll try to post some kind of summarization of what I'm finding.

Great. I'm looking forward for that summary.

Is there a tracking issue for this lint? I feel like at this point it should have one, and a quick search for the lint name didn't find one.

No, there isn't, the lint was insta-stablized by T-lang in #111567. I would just create a issue for your summary.

@bors bors merged commit 48b1e1a into rust-lang:master May 9, 2024
6 checks passed
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request May 9, 2024
Rollup merge of rust-lang#124908 - saethlin:ref-casting_bigger_place_projection, r=fee1-dead

Handle field projections like slice indexing in invalid_reference_casting

r? `@Urgau`

I saw the implementation in rust-lang#124761, and I was wondering if we also need to handle field access. We do. Without this PR, we get this errant diagnostic:
```
error: casting references to a bigger memory layout than the backing allocation is undefined behavior, even if the reference is unused
  --> /home/ben/rust/tests/ui/lint/reference_casting.rs:262:18
   |
LL |         let r = &mut v.0;
   |                      --- backing allocation comes from here
LL |         let ptr = r as *mut i32 as *mut Vec3<i32>;
   |                   ------------------------------- casting happend here
LL |         unsafe { *ptr = Vec3(0, 0, 0) }
   |                  ^^^^^^^^^^^^^^^^^^^^
   |
   = note: casting from `i32` (4 bytes) to `Vec3<i32>` (12 bytes)
```
@rustbot rustbot added this to the 1.80.0 milestone May 9, 2024
@saethlin saethlin deleted the ref-casting_bigger_place_projection branch May 9, 2024 15:51
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request May 11, 2024
…au,Nilstrieb

Handle Deref expressions in invalid_reference_casting

Similar to rust-lang#124908

See rust-lang#124951 for context; this PR fixes the last of the known false postiive cases with this lint that we encounter in Crater.
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request May 11, 2024
Rollup merge of rust-lang#124978 - saethlin:ref-casting_derefs, r=Urgau,Nilstrieb

Handle Deref expressions in invalid_reference_casting

Similar to rust-lang#124908

See rust-lang#124951 for context; this PR fixes the last of the known false postiive cases with this lint that we encounter in Crater.
RalfJung pushed a commit to RalfJung/miri that referenced this pull request May 12, 2024
Handle Deref expressions in invalid_reference_casting

Similar to rust-lang/rust#124908

See rust-lang/rust#124951 for context; this PR fixes the last of the known false postiive cases with this lint that we encounter in Crater.
@saethlin saethlin added the beta-nominated Nominated for backporting to the compiler in the beta channel. label Jun 1, 2024
@apiraino
Copy link
Contributor

apiraino commented Jun 6, 2024

Beta backport accepted as per compiler team on Zulip. A backport PR will be authored by the release team at the end of the current development cycle.

@rustbot label +beta-accepted

@rustbot rustbot added the beta-accepted Accepted for backporting to the compiler in the beta channel. label Jun 6, 2024
@cuviper cuviper mentioned this pull request Jun 6, 2024
@cuviper cuviper modified the milestones: 1.80.0, 1.79.0 Jun 6, 2024
@cuviper cuviper removed the beta-nominated Nominated for backporting to the compiler in the beta channel. label Jun 6, 2024
bors added a commit to rust-lang-ci/rust that referenced this pull request Jun 7, 2024
[beta] backports

- Fix insufficient logic when searching for the underlying allocation rust-lang#124761
- Handle field projections like slice indexing in invalid_reference_casting rust-lang#124908
- Handle Deref expressions in invalid_reference_casting rust-lang#124978
- Fix ICE in non-operand `aggregate_raw_ptr` instrinsic codegen rust-lang#125184
- Wrap Context.ext in AssertUnwindSafe rust-lang#125392
- Revert problematic opaque type change rust-lang#125489
- ast: Revert a breaking attribute visiting order change rust-lang#125734
- Update to LLVM 18.1.7 rust-lang#126061

r? cuviper
bors added a commit to rust-lang-ci/rust that referenced this pull request Jun 7, 2024
[beta] backports

- Fix insufficient logic when searching for the underlying allocation rust-lang#124761
- Handle field projections like slice indexing in invalid_reference_casting rust-lang#124908
- Handle Deref expressions in invalid_reference_casting rust-lang#124978
- Fix ICE in non-operand `aggregate_raw_ptr` instrinsic codegen rust-lang#125184
- Wrap Context.ext in AssertUnwindSafe rust-lang#125392
- Revert problematic opaque type change rust-lang#125489
- ast: Revert a breaking attribute visiting order change rust-lang#125734
- Update to LLVM 18.1.7 rust-lang#126061
- Revert "Disallow ambiguous attributes on expressions" on beta rust-lang#126102 / rust-lang#126101
- Silence double-symlink errors while building solaris toolchain rust-lang#126011

r? cuviper
bors added a commit to rust-lang-ci/rust that referenced this pull request Jun 7, 2024
[beta] backports

- Fix insufficient logic when searching for the underlying allocation rust-lang#124761
- Handle field projections like slice indexing in invalid_reference_casting rust-lang#124908
- Handle Deref expressions in invalid_reference_casting rust-lang#124978
- Fix ICE in non-operand `aggregate_raw_ptr` instrinsic codegen rust-lang#125184
- Wrap Context.ext in AssertUnwindSafe rust-lang#125392
- Revert problematic opaque type change rust-lang#125489
- ast: Revert a breaking attribute visiting order change rust-lang#125734
- Update to LLVM 18.1.7 rust-lang#126061
- Revert "Disallow ambiguous attributes on expressions" on beta rust-lang#126102 / rust-lang#126101
- Silence double-symlink errors while building solaris toolchain rust-lang#126011

r? cuviper
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
beta-accepted Accepted for backporting to the compiler in the beta channel. 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.

7 participants