Skip to content

Generalize the wide-pointer total-size bound#2290

Open
traviscross wants to merge 4 commits into
masterfrom
TC/generalize-wide-pointer-total-size-bound
Open

Generalize the wide-pointer total-size bound#2290
traviscross wants to merge 4 commits into
masterfrom
TC/generalize-wide-pointer-total-size-bound

Conversation

@traviscross

Copy link
Copy Markdown
Contributor

We document that, for references and Box<T>, pointed-to values with slice or str metadata must
be no larger than isize::MAX. We hadn't required this for pointed-to values with dyn metadata.
It's tempting to think this isn't necessary since we separately require that the metadata point to
a vtable generated by the compiler, which ensures the encoded size of the erased type is OK.

But the bound is on the total size of the pointed-to value, including any sized prefix of a type
with an unsized tail. Since the prefix combined with the size in the vtable can push us past the
limit, we need the separate restriction.

Let's apply the rule to both cases and add an admonition to remind ourselves of why this is needed.


I'm breaking this out from #2282 so that we can merge the prerequisites before considering the new lang guarantees.

This is stacked on #2286 and #2287 and #2288 and those should be merged first.

cc @ehuss @RalfJung @Mark-Simulacrum

The pointer-to-pointer cast rules and the wide-pointer validity rule
both speak of the *metadata* of a pointer, but we hadn't explicitly
defined the term (even though we had defined the contents of that
metadata).  Let's do that and link to it.
We refer to the unsized tail of a type, but we hadn't defined it.
Let's do that and link to the definition.
The validity rule for the metadata of a wide reference, `Box<T>`,
or raw pointer mentions `dyn Trait` and slice but had omitted
`str`.  Let's fix that.
We document that, for references and `Box<T>`, pointed-to values
with slice or `str` metadata must be no larger than `isize::MAX`.  We
hadn't required this for pointed-to values with `dyn` metadata.  It's
tempting to think this isn't necessary since we separately require
that the metadata point to a vtable generated by the compiler, which
ensures the encoded size of the erased type is OK.

But the bound is on the total size of the pointed-to value, including
any sized prefix of a type with an unsized tail.  Since the prefix
combined with the size in the vtable can push us past the limit, we
need the separate restriction.

Let's apply the rule to both cases and add an admonition to remind
ourselves of why this is needed.
@rustbot rustbot added the S-waiting-on-review Status: The marked PR is awaiting review from a maintainer label Jun 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-review Status: The marked PR is awaiting review from a maintainer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants