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

Put a bound on collection misbehavior #97316

Merged
merged 2 commits into from
Jun 1, 2022
Merged

Commits on May 23, 2022

  1. Put a bound on collection misbehavior

    As currently written, when a logic error occurs in a collection's trait
    parameters, this allows *completely arbitrary* misbehavior, so long as
    it does not cause undefined behavior in std. However, because the extent
    of misbehavior is not specified, it is allowed for *any* code in std to
    start misbehaving in arbitrary ways which are not formally UB; consider
    the theoretical example of a global which gets set on an observed logic
    error. Because the misbehavior is only bound by not resulting in UB from
    safe APIs and the crate-level encapsulation boundary of all of std, this
    makes writing user unsafe code that utilizes std theoretically
    impossible, as it now relies on undocumented QOI that unrelated parts of
    std cannot be caused to misbehave by a misuse of std::collections APIs.
    
    In practice, this is a nonconcern, because std has reasonable QOI and an
    implementation that takes advantage of this freedom is essentially a
    malicious implementation and only compliant by the most langauage-lawyer
    reading of the documentation.
    
    To close this hole, we just add a small clause to the existing logic
    error paragraph that ensures that any misbehavior is limited to the
    collection which observed the logic error, making it more plausible to
    prove the soundness of user unsafe code.
    
    This is not meant to be formal; a formal refinement would likely need to
    mention that values derived from the collection can also misbehave after a
    logic error is observed, as well as define what it means to "observe" a
    logic error in the first place. This fix errs on the side of informality
    in order to close the hole without complicating a normal reading which
    can assume a reasonable nonmalicious QOI.
    
    See also [discussion on IRLO][1].
    
    [1]: https://internals.rust-lang.org/t/using-std-collections-and-unsafe-anything-can-happen/16640
    CAD97 committed May 23, 2022
    Configuration menu
    Copy the full SHA
    67aca49 View commit details
    Browse the repository at this point in the history

Commits on May 31, 2022

  1. BTreeSet->BTreeMap (fix copy/paste mistake in documentation)

    Co-authored-by: lcnr <rust@lcnr.de>
    dtolnay and lcnr authored May 31, 2022
    Configuration menu
    Copy the full SHA
    e6b1003 View commit details
    Browse the repository at this point in the history