LazyStaticType::get_or_init
returns an *mut
instead of a &
ref
#994
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Previously, we were returning a
&ffi::PyTypeObject
. However, we were often casting this immutable reference to a*mut ffi::PyTypeObject
and then passing that pointer to FFI functions.But we don't know whether the FFI functions mutate the
PyTypeObject
behind our back or not, and if they do, I believe that this is Undefined Behavior because the pointer comes from a shared reference.Unfortunately, these things are very badly documented: I'm only aware of this because I followed many Unsafe Code Guideline discussions. Best source that I could get is the following comment from @RalfJung, who is very knowledgeable on the subject. The details are probably written in the Stacked Borrows paper, to be fair.
Even if it's not UB right now because of ill-specification or because of the compiler not taking advantage of it, we'd better be safe.