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

Tracking issue for Ref/RefMut::map_split #51476

Closed
2 tasks done
joshlf opened this issue Jun 10, 2018 · 25 comments
Closed
2 tasks done

Tracking issue for Ref/RefMut::map_split #51476

joshlf opened this issue Jun 10, 2018 · 25 comments
Labels
C-tracking-issue Category: An issue tracking the progress of sth. like the implementation of an RFC disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. T-libs-api Relevant to the library API team, which will review and decide on the PR/issue.

Comments

@joshlf
Copy link
Contributor

joshlf commented Jun 10, 2018

Tracking issue for Ref::map_split and RefMut::map_split (feature refcell_map_split), implemented in #51466.

Blocking stabilization

cc @RalfJung @jhjourdan

@stokhos stokhos added T-lang Relevant to the language team, which will review and decide on the PR/issue. T-libs-api Relevant to the library API team, which will review and decide on the PR/issue. labels Jun 10, 2018
@RalfJung
Copy link
Member

Can I just say how awesome it is for people to actually be willing to block something on a proof of soundness? I love this community <3

@jkordish jkordish added the C-tracking-issue Category: An issue tracking the progress of sth. like the implementation of an RFC label Jun 26, 2018
@jhjourdan
Copy link
Contributor

I have just completed the proof of soundness of this new feature:

https://gitlab.mpi-sws.org/FP/LambdaRust-coq/commit/70db5cbf1f63879ff8171218d4ba679e8e4c69a2

Note, however, that our model do not model machine integer. Therefore, it is possible that our proof would not spot an overflow in the borrow counter that would cause an unsoundness. That said, causing an overflow in the borrow counter is very hard anyway.

@joshlf
Copy link
Contributor Author

joshlf commented Sep 21, 2018

That's fantastic! Thanks so much for doing that! In your opinion, is integer overflow something we should be concerned about, or are you comfortable that it's not an issue even though the proof doesn't technically cover it?

@joshtriplett @dtolnay Anything left to do before proposing stabilization?

@joshtriplett
Copy link
Member

Given recent events, I think it's rather reasonable to want to carefully examine the assumptions that integer overflow can't happen here.

Looking over the code, it appears that several of the overflow checks occur in a debug_assert! rather than an assert!, for instance.

@jhjourdan
Copy link
Contributor

That's fantastic! Thanks so much for doing that! In your opinion, is integer overflow something we should be concerned about, or are you comfortable that it's not an issue even though the proof doesn't technically cover it?

Of course, a thorough review of the code cannot hurt. But actually, I cannot imagine a realistic scenario where this overflow would occur without causing an out of memory first (or using a lot of mem::forget calls for each of the created Ref/RefMut, which is also a weird thing to do).

@jhjourdan
Copy link
Contributor

Looking over the code, it appears that several of the overflow checks occur in a debug_assert! rather than an assert!, for instance.

What overflow check are you speaking about? Reading the current state of the code, all the overflow checks are either is_reading(...) or is_writing(...) or self.borrow.get() == UNUSED, none of which check for overflow.

As far as I can tell, each incrementation or decrementation of the counter in this code is either guarded by an overflow check or cannot overflow because of the current sate of the counter.

@joshlf
Copy link
Contributor Author

joshlf commented Sep 21, 2018

That's fantastic! Thanks so much for doing that! In your opinion, is integer overflow something we should be concerned about, or are you comfortable that it's not an issue even though the proof doesn't technically cover it?

Of course, a thorough review of the code cannot hurt. But actually, I cannot imagine a realistic scenario where this overflow would occur without causing an out of memory first (or using a lot of mem::forget calls for each of the created Ref/RefMut, which is also a weird thing to do).

Unsoundness is unsoundness, regardless of how pathological the program would have to be :)

But regardless, I don't think it's an issue. All overflow is checked by assert!s. The debug_assert!s only check for conditions which we, the programmers, believe should always be true. In particular:

  • This one is in BorrowRef::drop, and asserts that the borrow is a reading borrow. BorrowRef is a reading borrow, so if it weren't true, it'd be a bug.
  • This one is in BorrowRef::clone, and asserts that the borrow is a reading borrow. It's safe for the same reason as the previous one.
  • This one and this one are in BorrowRefMut::drop and BorrowRefMut::clone respectively, check that the borrow is a writing borrow, and are safe for the same reason.

@joshtriplett
Copy link
Member

@joshlf Thanks for clarifying! With that clarification on the debug_assert! calls, this LGTM.

@joshtriplett
Copy link
Member

That said: could someone add a note to the comment at the top of that file, regarding checking for overflow, that any such overflow checks must be assert! and not debug_assert!, just to make it less likely that future changes accidentally make that mistake?

@Centril
Copy link
Contributor

Centril commented Nov 10, 2018

@sfackler shall we stabilize this perhaps?

@SimonSapin
Copy link
Contributor

We previously had Ref::filter_map and removed it in #27746. If map_split is deemed useful enough for inclusion in the standard library, should filter_map be brought back? @rust-lang/libs what do you think?

@joshlf
Copy link
Contributor Author

joshlf commented Jan 18, 2019

We previously had Ref::filter_map and removed it in #27746. If map_split is deemed useful enough for inclusion in the standard library, should filter_map be brought back?

FWIW, my own use case for map_split has gone away; I no longer use it anymore. So I wouldn't oversell the utility of map_split :)

@alexcrichton
Copy link
Member

I don't personally have an opinion, I'd be fine either way

@sgrif
Copy link
Contributor

sgrif commented Jan 28, 2019

I definitely think this opens a door to a ton of other methods that may be desired, and are just as easily justified, that we may not want to support. For example, fn map_result<T, U, E>(orig: RefMut<'_, T>, f: impl FnOnce(&mut T) -> Result<&mut U, E>) -> Result<RefMut<'_, U>, E> is something that I've needed.

It's worth noting though that filter_map, map_result, and probably others that folks want, can be implemented in a library. I don't see any way that split_map could be.

@SimonSapin
Copy link
Contributor

This is a fair point. split_map needs to change RefCell fundamentally to make it track (reference count) multiple multiple mutable borrows (of disjoint parts of course). Implementing filter_map in another crate requires unsafe and is tricky to get right, but it is not impossible.

Alright, let’s stabilize split_map, we can always reconsider adding filter_map later.

@rfcbot fcp merge

@rfcbot
Copy link

rfcbot commented Feb 1, 2019

Team member @SimonSapin has proposed to merge this. The next step is review by the rest of the tagged team members:

No concerns currently listed.

Once a majority of reviewers approve (and none object), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up!

See this document for info about what commands tagged team members can give me.

@rfcbot rfcbot added proposed-final-comment-period Proposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off. disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. labels Feb 1, 2019
@SimonSapin
Copy link
Contributor

I’m not sure this needs sign-off from the whole lang team though. UnsafeCell is a lang item but RefCell is not and it could (as a whole) be a separate library. @rust-lang/lang what do you think?

@scottmcm
Copy link
Member

scottmcm commented Feb 2, 2019

I agree, @SimonSapin -- this looks like a purely library change to me.

@SimonSapin
Copy link
Contributor

Alright.

@rfcbot fcp cancel

@rfcbot
Copy link

rfcbot commented Feb 2, 2019

@SimonSapin proposal cancelled.

@rfcbot rfcbot removed proposed-final-comment-period Proposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off. disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. labels Feb 2, 2019
@SimonSapin SimonSapin removed the T-lang Relevant to the language team, which will review and decide on the PR/issue. label Feb 2, 2019
@SimonSapin
Copy link
Contributor

@rfcbot fcp merge

@rfcbot
Copy link

rfcbot commented Feb 2, 2019

Team member @SimonSapin has proposed to merge this. The next step is review by the rest of the tagged team members:

No concerns currently listed.

Once a majority of reviewers approve (and at most 2 approvals are outstanding), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up!

See this document for info about what commands tagged team members can give me.

@rfcbot rfcbot added proposed-final-comment-period Proposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off. disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. labels Feb 2, 2019
@Centril
Copy link
Contributor

Centril commented Mar 6, 2019

Ping @Kimundi @sfackler @withoutboats :)

@rfcbot rfcbot added final-comment-period In the final comment period and will be merged soon unless new substantive objections are raised. and removed proposed-final-comment-period Proposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off. labels Mar 6, 2019
@rfcbot
Copy link

rfcbot commented Mar 6, 2019

🔔 This is now entering its final comment period, as per the review above. 🔔

@rfcbot rfcbot added finished-final-comment-period The final comment period is finished for this PR / Issue. and removed final-comment-period In the final comment period and will be merged soon unless new substantive objections are raised. labels Mar 16, 2019
@rfcbot
Copy link

rfcbot commented Mar 16, 2019

The final comment period, with a disposition to merge, as per the review above, is now complete.

As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed.

The RFC will be merged soon.

joshlf added a commit to joshlf/rust that referenced this issue Mar 18, 2019
Centril added a commit to Centril/rust that referenced this issue Mar 19, 2019
…cell-map-split, r=cramertj,Centril

Stabilize refcell_map_split feature

Closes rust-lang#51476.
Centril added a commit to Centril/rust that referenced this issue Mar 19, 2019
…cell-map-split, r=cramertj,Centril

Stabilize refcell_map_split feature

Closes rust-lang#51476.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-tracking-issue Category: An issue tracking the progress of sth. like the implementation of an RFC disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. T-libs-api Relevant to the library API team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests