-
Notifications
You must be signed in to change notification settings - Fork 51
Frequently requested changes: add bypassing visibility #323
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
base: master
Are you sure you want to change the base?
Conversation
@rustbot labels +I-lang-nominated |
Thanks, this looks good to me. Nominating for team discussion. |
|
||
## A way to bypass visibility, including an `unsafe` bypass | ||
|
||
Items are only accessible if they are marked `pub` or re-exported as such; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This line doesn't read correctly to me as stated, i.e. "or re-exported as such" seems too strong. E.g.:
mod m {
fn f() {}
}
pub use m::f; //~ ERROR function `f` is private
Forking a crate (to insert the necessary `pub`s) does not have these | ||
problems. As such, a better way to achieve this would be to make patch | ||
dependencies more ergonomic to use and maintain. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Forking a crate (to insert the necessary `pub`s) does not have these | |
problems. As such, a better way to achieve this would be to make patch | |
dependencies more ergonomic to use and maintain. | |
Forking a crate (to insert the necessary `pub`s) does not have these | |
problems, and so making patch dependencies more ergonomic to use and | |
maintain could be one alternative to explore. |
Making it `unsafe` does nothing to prevent these issues. `unsafe` is | ||
used to deal with memory safety problems and it is not in any way useful to | ||
deal with SemVer concerns. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Making it `unsafe` does nothing to prevent these issues. `unsafe` is | |
used to deal with memory safety problems and it is not in any way useful to | |
deal with SemVer concerns. | |
This does not fit with our model of `unsafe` in Rust. |
More importantly, allowing people to violate privacy would destroy SemVer. | ||
If people can access and use implementation details of other crates then | ||
that means that almost any change is now a breaking change. This would lead | ||
to widespread fallout across the crate ecosystem. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
More importantly, allowing people to violate privacy would destroy SemVer. | |
If people can access and use implementation details of other crates then | |
that means that almost any change is now a breaking change. This would lead | |
to widespread fallout across the crate ecosystem. | |
It's also hard to see how allowing privacy violations could be made | |
compatible with SemVer. |
It seems worth adding a note here somewhere that unsafe does allow the use of |
We discussed this in the call today, including debating the merits of the "devil's advocate" case. Where we landed is that we're OK with including this item, but in addition to the edits above, we probably want to edit this further so that it reads more as "here's why this would be hard and some of the problems you'd need to address in any proposal" rather than as seeming to suggest that we'd never do it. Essentially, a proposal for this would need to discuss, among other things:
|
Inspired by @RalfJung at https://internals.rust-lang.org/t/discussion-allowing-unsafe-to-bypass-visibility/22606/8
A way to bypass visibility, including an
unsafe
bypassItems are only accessible if they are marked
pub
or re-exported as such;they are otherwise private by default. People sometimes wish to break that
rule to access internals of libraries they're using, for example to access
private fields of a type or to call private functions.
This could break invariants assumed by the crate's author, which, if any
unsafe code depends on those, could lead to undefined behavior.
More importantly, allowing people to violate privacy would destroy SemVer.
If people can access and use implementation details of other crates then
that means that almost any change is now a breaking change. This would lead
to widespread fallout across the crate ecosystem.
Making it
unsafe
does nothing to prevent these issues.unsafe
isused to deal with memory safety problems and it is not in any way useful to
deal with SemVer concerns.
Forking a crate (to insert the necessary
pub
s) does not have theseproblems. As such, a better way to achieve this would be to make patch
dependencies more ergonomic to use and maintain.