Skip to content

Commit bf597b9

Browse files
authored
Merge pull request #193 from RalfJung/value-domain
Value Domain: note the provenance problems
2 parents 727fc88 + 0f8fd1a commit bf597b9

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

wip/value-domain.md

+9
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ We show some examples for how one might want to use this `Value` domain to defin
5151
The value relation for `bool` relates `Bool(b)` with `[r]` if and only if `r.as_int() == Some(if b { 1 } else { 0 })`.
5252
(`as_int` is defined in [the memory interface][memory-interface].)
5353

54+
**Note:** Here and in the following, we implicitly perform a ptr-to-int cast when loading a `PtrFragment` at a non-pointer type.
55+
This basically means that non-pointer types carry no [provenance], and "superflous" provenance is implicitly stripped on loads.
56+
There are [quite a few problems](https://github.com/rust-lang/unsafe-code-guidelines/issues/181#issuecomment-519860562) with this approach,
57+
but there is also no known alternative that has no problems.
58+
For this document (in accordance with what Miri does), we chose the option that has least UB, to avoid false positives.
59+
But this means there are likely many false negatives, and the final Rust spec will likely have more UB than this WIP document!
60+
61+
[provenance]: https://github.com/rust-lang/unsafe-code-guidelines/blob/master/reference/src/glossary.md#pointer-provenance
62+
5463
### `()`
5564

5665
The value relation for the `()` type relates the empty tuple `Tuple([])` (assuming we can use array notation to "match" on `Vec`) with the empty byte list `[]`, and that's it.

0 commit comments

Comments
 (0)