Skip to content

Tracking issue for Ref/RefMut::map_split #51476

@joshlf

Description

@joshlf
Contributor

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

Blocking stabilization

cc @RalfJung @jhjourdan

Activity

added
T-langRelevant to the language team
T-libs-apiRelevant to the library API team, which will review and decide on the PR/issue.
on Jun 10, 2018
RalfJung

RalfJung commented on Jun 19, 2018

@RalfJung
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

added
C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFC
on Jun 26, 2018
jhjourdan

jhjourdan commented on Sep 21, 2018

@jhjourdan
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

joshlf commented on Sep 21, 2018

@joshlf
ContributorAuthor

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

joshtriplett commented on Sep 21, 2018

@joshtriplett
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

jhjourdan commented on Sep 21, 2018

@jhjourdan
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

jhjourdan commented on Sep 21, 2018

@jhjourdan
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

joshlf commented on Sep 21, 2018

@joshlf
ContributorAuthor

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

joshtriplett commented on Sep 21, 2018

@joshtriplett
Member

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

joshtriplett

joshtriplett commented on Sep 21, 2018

@joshtriplett
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

Centril commented on Nov 10, 2018

@Centril
Contributor

@sfackler shall we stabilize this perhaps?

SimonSapin

SimonSapin commented on Jan 18, 2019

@SimonSapin
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?

16 remaining items

added
proposed-final-comment-periodProposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off.
disposition-mergeThis issue / PR is in PFCP or FCP with a disposition to merge it.
on Feb 2, 2019
Centril

Centril commented on Mar 6, 2019

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

rfcbot commented on Mar 6, 2019

@rfcbot
Collaborator

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

added and removed
final-comment-periodIn the final comment period and will be merged soon unless new substantive objections are raised.
on Mar 16, 2019
rfcbot

rfcbot commented on Mar 16, 2019

@rfcbot
Collaborator

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.

added 2 commits that reference this issue on Mar 19, 2019
631534c
a3581ac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCT-libs-apiRelevant to the library API team, which will review and decide on the PR/issue.disposition-mergeThis issue / PR is in PFCP or FCP with a disposition to merge it.finished-final-comment-periodThe final comment period is finished for this PR / Issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @jkordish@alexcrichton@joshtriplett@SimonSapin@RalfJung

        Issue actions

          Tracking issue for Ref/RefMut::map_split · Issue #51476 · rust-lang/rust