Tree Borrows permission states and the per-node access transition function.
This is a port of transition::{child_read, foreign_read, child_write, foreign_write, perform_access} in the pinned Miri source:
upstream/miri-source/src/borrow_tracker/tree_borrows/perms.rs.
The corresponding upstream revision is
7fa591d7d4dd9af8154becbc8332f8096f8323b1 (blob
0dd4712b85c7d660eb0a4395223335b2b766062b).
This module models only one permission at one location. It does not model a borrow tree, provenance, memory, initialization, protector lifetime, or diagnostic transition history.
The activation states of a Tree Borrows pointer.
- Cell : Permission
A shared reference to interior mutable data.
- ReservedFrz
(conflicted : Bool)
: Permission
A local mutable reference not yet written through.
- ReservedIM : Permission
A reservation to interior mutable data.
- Unique : Permission
A unique pointer.
- Frozen : Permission
A shared, read-only pointer.
- Disabled : Permission
A disabled pointer.
Instances For
Equations
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Cell Miri.TreeBorrows.Permission.Cell = isTrue ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Cell (Miri.TreeBorrows.Permission.ReservedFrz conflicted) = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Cell Miri.TreeBorrows.Permission.ReservedIM = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_2
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Cell Miri.TreeBorrows.Permission.Unique = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_3
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Cell Miri.TreeBorrows.Permission.Frozen = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_4
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Cell Miri.TreeBorrows.Permission.Disabled = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_5
- Miri.TreeBorrows.instDecidableEqPermission.decEq (Miri.TreeBorrows.Permission.ReservedFrz conflicted) Miri.TreeBorrows.Permission.Cell = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq (Miri.TreeBorrows.Permission.ReservedFrz a) (Miri.TreeBorrows.Permission.ReservedFrz b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq (Miri.TreeBorrows.Permission.ReservedFrz conflicted) Miri.TreeBorrows.Permission.ReservedIM = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq (Miri.TreeBorrows.Permission.ReservedFrz conflicted) Miri.TreeBorrows.Permission.Unique = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq (Miri.TreeBorrows.Permission.ReservedFrz conflicted) Miri.TreeBorrows.Permission.Frozen = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq (Miri.TreeBorrows.Permission.ReservedFrz conflicted) Miri.TreeBorrows.Permission.Disabled = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.ReservedIM Miri.TreeBorrows.Permission.Cell = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_13
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.ReservedIM (Miri.TreeBorrows.Permission.ReservedFrz conflicted) = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.ReservedIM Miri.TreeBorrows.Permission.ReservedIM = isTrue ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.ReservedIM Miri.TreeBorrows.Permission.Unique = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_15
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.ReservedIM Miri.TreeBorrows.Permission.Frozen = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_16
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.ReservedIM Miri.TreeBorrows.Permission.Disabled = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_17
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Unique Miri.TreeBorrows.Permission.Cell = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_18
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Unique (Miri.TreeBorrows.Permission.ReservedFrz conflicted) = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Unique Miri.TreeBorrows.Permission.ReservedIM = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_20
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Unique Miri.TreeBorrows.Permission.Unique = isTrue ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Unique Miri.TreeBorrows.Permission.Frozen = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_21
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Unique Miri.TreeBorrows.Permission.Disabled = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_22
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Frozen Miri.TreeBorrows.Permission.Cell = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_23
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Frozen (Miri.TreeBorrows.Permission.ReservedFrz conflicted) = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Frozen Miri.TreeBorrows.Permission.ReservedIM = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_25
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Frozen Miri.TreeBorrows.Permission.Unique = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_26
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Frozen Miri.TreeBorrows.Permission.Frozen = isTrue ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Frozen Miri.TreeBorrows.Permission.Disabled = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_27
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Disabled Miri.TreeBorrows.Permission.Cell = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_28
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Disabled (Miri.TreeBorrows.Permission.ReservedFrz conflicted) = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Disabled Miri.TreeBorrows.Permission.ReservedIM = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_30
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Disabled Miri.TreeBorrows.Permission.Unique = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_31
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Disabled Miri.TreeBorrows.Permission.Frozen = isFalse Miri.TreeBorrows.instDecidableEqPermission.decEq._proof_32
- Miri.TreeBorrows.instDecidableEqPermission.decEq Miri.TreeBorrows.Permission.Disabled Miri.TreeBorrows.Permission.Disabled = isTrue ⋯
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Equations
Whether an access is through this node or one of its children.
- LocalAccess : AccessRelatedness
- ForeignAccess : AccessRelatedness
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
true exactly for an ancestor, sibling, cousin, or other non-child access.
Equations
Instances For
Outcomes of Miri's Option<PermissionPriv> transition function.
UndefinedBehavior corresponds to upstream None for a forbidden child
access. ImpossibleProtectedReservedIM preserves the upstream assert!(!protected)
branches: those are invariant failures, not ordinary UB outcomes.
- Transition (permission : Permission) : AccessOutcome
- UndefinedBehavior : AccessOutcome
- ImpossibleProtectedReservedIM : AccessOutcome
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Miri.TreeBorrows.instDecidableEqAccessOutcome.decEq (Miri.TreeBorrows.AccessOutcome.Transition a) (Miri.TreeBorrows.AccessOutcome.Transition b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Miri.TreeBorrows.instDecidableEqAccessOutcome.decEq (Miri.TreeBorrows.AccessOutcome.Transition permission) Miri.TreeBorrows.AccessOutcome.UndefinedBehavior = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqAccessOutcome.decEq (Miri.TreeBorrows.AccessOutcome.Transition permission) Miri.TreeBorrows.AccessOutcome.ImpossibleProtectedReservedIM = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqAccessOutcome.decEq Miri.TreeBorrows.AccessOutcome.UndefinedBehavior (Miri.TreeBorrows.AccessOutcome.Transition permission) = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqAccessOutcome.decEq Miri.TreeBorrows.AccessOutcome.UndefinedBehavior Miri.TreeBorrows.AccessOutcome.UndefinedBehavior = isTrue ⋯
- Miri.TreeBorrows.instDecidableEqAccessOutcome.decEq Miri.TreeBorrows.AccessOutcome.ImpossibleProtectedReservedIM (Miri.TreeBorrows.AccessOutcome.Transition permission) = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqAccessOutcome.decEq Miri.TreeBorrows.AccessOutcome.ImpossibleProtectedReservedIM Miri.TreeBorrows.AccessOutcome.ImpossibleProtectedReservedIM = isTrue ⋯
Instances For
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Apply the pinned Miri transition rules to one permission.
The dispatcher is the same four-way match as upstream on (kind, rel_pos.is_foreign()).
Equations
- Miri.TreeBorrows.performAccess Miri.TreeBorrows.AccessKind.Write relPos old isProtected = Miri.TreeBorrows.foreignWrite✝ old isProtected
- Miri.TreeBorrows.performAccess Miri.TreeBorrows.AccessKind.Read relPos old isProtected = Miri.TreeBorrows.foreignRead✝ old isProtected
- Miri.TreeBorrows.performAccess Miri.TreeBorrows.AccessKind.Write relPos old isProtected = Miri.TreeBorrows.childWrite✝ old isProtected
- Miri.TreeBorrows.performAccess Miri.TreeBorrows.AccessKind.Read relPos old isProtected = Miri.TreeBorrows.childRead✝ old
Instances For
Whether this permission is one of the upstream initial states.
Equations
- (Miri.TreeBorrows.Permission.ReservedFrz false).isInitial = true
- Miri.TreeBorrows.Permission.Frozen.isInitial = true
- Miri.TreeBorrows.Permission.ReservedIM.isInitial = true
- Miri.TreeBorrows.Permission.Cell.isInitial = true
- Miri.TreeBorrows.Permission.Unique.isInitial = true
- (Miri.TreeBorrows.Permission.ReservedFrz true).isInitial = false
- Miri.TreeBorrows.Permission.Disabled.isInitial = false
Instances For
Source ordering by reachability of permission transitions.
This captures the PartialOrd relation from PermissionPriv::partial_cmp:
Cell is isolated; ReservedIM is incomparable with either ReservedFrz state;
all remaining reachable states form the Reserved → Unique → Frozen → Disabled
chain, with the conflicted Reserved state above the unconflicted one.
Equations
- Miri.TreeBorrows.permissionLE Miri.TreeBorrows.Permission.Cell Miri.TreeBorrows.Permission.Cell = true
- Miri.TreeBorrows.permissionLE (Miri.TreeBorrows.Permission.ReservedFrz false) (Miri.TreeBorrows.Permission.ReservedFrz conflicted) = true
- Miri.TreeBorrows.permissionLE (Miri.TreeBorrows.Permission.ReservedFrz true) (Miri.TreeBorrows.Permission.ReservedFrz true) = true
- Miri.TreeBorrows.permissionLE (Miri.TreeBorrows.Permission.ReservedFrz conflicted) Miri.TreeBorrows.Permission.Unique = true
- Miri.TreeBorrows.permissionLE (Miri.TreeBorrows.Permission.ReservedFrz conflicted) Miri.TreeBorrows.Permission.Frozen = true
- Miri.TreeBorrows.permissionLE (Miri.TreeBorrows.Permission.ReservedFrz conflicted) Miri.TreeBorrows.Permission.Disabled = true
- Miri.TreeBorrows.permissionLE Miri.TreeBorrows.Permission.ReservedIM Miri.TreeBorrows.Permission.ReservedIM = true
- Miri.TreeBorrows.permissionLE Miri.TreeBorrows.Permission.ReservedIM Miri.TreeBorrows.Permission.Unique = true
- Miri.TreeBorrows.permissionLE Miri.TreeBorrows.Permission.ReservedIM Miri.TreeBorrows.Permission.Frozen = true
- Miri.TreeBorrows.permissionLE Miri.TreeBorrows.Permission.ReservedIM Miri.TreeBorrows.Permission.Disabled = true
- Miri.TreeBorrows.permissionLE Miri.TreeBorrows.Permission.Unique Miri.TreeBorrows.Permission.Unique = true
- Miri.TreeBorrows.permissionLE Miri.TreeBorrows.Permission.Unique Miri.TreeBorrows.Permission.Frozen = true
- Miri.TreeBorrows.permissionLE Miri.TreeBorrows.Permission.Unique Miri.TreeBorrows.Permission.Disabled = true
- Miri.TreeBorrows.permissionLE Miri.TreeBorrows.Permission.Frozen Miri.TreeBorrows.Permission.Frozen = true
- Miri.TreeBorrows.permissionLE Miri.TreeBorrows.Permission.Frozen Miri.TreeBorrows.Permission.Disabled = true
- Miri.TreeBorrows.permissionLE Miri.TreeBorrows.Permission.Disabled Miri.TreeBorrows.Permission.Disabled = true
- Miri.TreeBorrows.permissionLE x✝¹ x✝ = false
Instances For
Result corresponding to Rust's Option<Ordering> for the source
PermissionPriv::partial_cmp.
- Incomparable : PermissionOrdering
- Less : PermissionOrdering
- Equal : PermissionOrdering
- Greater : PermissionOrdering
Instances For
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Whether a local access to a permission is allowed by the wildcard cache.
- None : WildcardAccessLevel
- Read : WildcardAccessLevel
- Write : WildcardAccessLevel
Instances For
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Whether a foreign access can be skipped after a recorded subtree access.
- None : IdempotentForeignAccess
- Read : IdempotentForeignAccess
- Write : IdempotentForeignAccess
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Whether this cached access level allows the requested access kind.
Equations
- Miri.TreeBorrows.WildcardAccessLevel.None.allows kind = false
- Miri.TreeBorrows.WildcardAccessLevel.Read.allows Miri.TreeBorrows.AccessKind.Read = true
- Miri.TreeBorrows.WildcardAccessLevel.Read.allows Miri.TreeBorrows.AccessKind.Write = false
- Miri.TreeBorrows.WildcardAccessLevel.Write.allows kind = true
Instances For
Instances For
Instances For
Construct a foreign access from its access kind.
Equations
Instances For
Convert an access and its relation to the cache's recorded-access value.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Result of the source skip check, including its debug assertion.
- Decision (canSkip : Bool) : SkipCheckResult
- DebugAssertion : SkipCheckResult
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Whether the recorded access allows skipping the next foreign access.
The source's debug_assert!(happeningNext.is_foreign()) is represented
explicitly for calls outside its documented domain.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Update a recorded access exactly as the source record_new method does.
Equations
Instances For
Weaken a cache value when a newly inserted child has a weaker value.
Equations
Instances For
Equations
Instances For
Instances For
Instances For
Instances For
Instances For
The access Miri associates with this permission when releasing protection or reborrowing.
Equations
Instances For
Whether a parent permission can be soundly replaced by the given child during the source's tree compaction. The caller must ensure the parent is not protected, as the source documents.
Equations
- Miri.TreeBorrows.Permission.Cell.canBeReplacedByChild child = true
- parent.canBeReplacedByChild Miri.TreeBorrows.Permission.Cell = false
- Miri.TreeBorrows.Permission.ReservedIM.canBeReplacedByChild child = true
- parent.canBeReplacedByChild Miri.TreeBorrows.Permission.ReservedIM = false
- (Miri.TreeBorrows.Permission.ReservedFrz conflicted).canBeReplacedByChild child = true
- parent.canBeReplacedByChild (Miri.TreeBorrows.Permission.ReservedFrz conflicted) = false
- Miri.TreeBorrows.Permission.Unique.canBeReplacedByChild Miri.TreeBorrows.Permission.Unique = true
- Miri.TreeBorrows.Permission.Unique.canBeReplacedByChild Miri.TreeBorrows.Permission.Frozen = true
- Miri.TreeBorrows.Permission.Unique.canBeReplacedByChild Miri.TreeBorrows.Permission.Disabled = true
- parent.canBeReplacedByChild Miri.TreeBorrows.Permission.Unique = false
- Miri.TreeBorrows.Permission.Frozen.canBeReplacedByChild Miri.TreeBorrows.Permission.Frozen = true
- Miri.TreeBorrows.Permission.Frozen.canBeReplacedByChild Miri.TreeBorrows.Permission.Disabled = true
- parent.canBeReplacedByChild Miri.TreeBorrows.Permission.Frozen = false
- Miri.TreeBorrows.Permission.Disabled.canBeReplacedByChild Miri.TreeBorrows.Permission.Disabled = true
Instances For
Strongest foreign action this node survives unchanged.
ImpossibleProtectedReservedIM preserves the upstream unreachable! branch
as an invariant failure instead of treating it as an ordinary result.
- Access (access : IdempotentForeignAccess) : IdempotentAccessResult
- ImpossibleProtectedReservedIM : IdempotentAccessResult
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Miri.TreeBorrows.Permission.Cell.strongestIdempotentForeignAccess isProtected = Miri.TreeBorrows.Permission.IdempotentAccessResult.Access Miri.TreeBorrows.IdempotentForeignAccess.Write
- (Miri.TreeBorrows.Permission.ReservedFrz true).strongestIdempotentForeignAccess isProtected = Miri.TreeBorrows.Permission.IdempotentAccessResult.Access Miri.TreeBorrows.IdempotentForeignAccess.Read
- Miri.TreeBorrows.Permission.Unique.strongestIdempotentForeignAccess isProtected = Miri.TreeBorrows.Permission.IdempotentAccessResult.Access Miri.TreeBorrows.IdempotentForeignAccess.None
- Miri.TreeBorrows.Permission.Frozen.strongestIdempotentForeignAccess isProtected = Miri.TreeBorrows.Permission.IdempotentAccessResult.Access Miri.TreeBorrows.IdempotentForeignAccess.Read
- Miri.TreeBorrows.Permission.Disabled.strongestIdempotentForeignAccess isProtected = Miri.TreeBorrows.Permission.IdempotentAccessResult.Access Miri.TreeBorrows.IdempotentForeignAccess.Write
Instances For
Strongest local access that does not cause UB, used by wildcard tracking.
Equations
- One or more equations did not get rendered due to their size.
- Miri.TreeBorrows.Permission.Disabled.strongestAllowedLocalAccess isProtected = Miri.TreeBorrows.WildcardAccessLevel.None
- Miri.TreeBorrows.Permission.Frozen.strongestAllowedLocalAccess isProtected = Miri.TreeBorrows.WildcardAccessLevel.Read
- permission.strongestAllowedLocalAccess isProtected = Miri.TreeBorrows.WildcardAccessLevel.Write
Instances For
A transition reconstructed by the source diagnostics and permission API.
- fromPermission : Permission
- toPermission : Permission
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Equations
- transition.isPossible = Miri.TreeBorrows.permissionLE transition.fromPermission transition.toPermission
Instances For
Equations
- transition.isNoop = (transition.fromPermission == transition.toPermission)
Instances For
Apply this transition only when the supplied starting permission matches.
Equations
Instances For
Equations
- transition.producesDisabled = transition.toPermission.isDisabled
Instances For
Equations
- transition.endpoint = transition.toPermission
Instances For
Permission-level result of the public source Permission::perform_access
wrapper, retaining an explicit label for its invariant panic.
- Transition (transition : PermTransition) : PermTransitionOutcome
- UndefinedBehavior : PermTransitionOutcome
- ImpossibleProtectedReservedIM : PermTransitionOutcome
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Miri.TreeBorrows.instDecidableEqPermTransitionOutcome.decEq Miri.TreeBorrows.PermTransitionOutcome.UndefinedBehavior (Miri.TreeBorrows.PermTransitionOutcome.Transition transition) = isFalse ⋯
- Miri.TreeBorrows.instDecidableEqPermTransitionOutcome.decEq Miri.TreeBorrows.PermTransitionOutcome.UndefinedBehavior Miri.TreeBorrows.PermTransitionOutcome.UndefinedBehavior = isTrue ⋯
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Convert the per-node result to the source PermTransition wrapper form.
Equations
- One or more equations did not get rendered due to their size.
Instances For
A write activates an unconflicted two-phase reservation.
If the protector invariant holds, the two upstream assertion branches are unreachable. The invariant excludes only protected ReservedIM; Cell may be protected, as in upstream behavior.
Every successful per-node transition is nondecreasing in Miri's source permission ordering.
Tree compaction always permits replacing a permission with itself.
The strongest-local-access summary agrees with the local read/write transition function: it allows exactly the accesses that are not UB.
A recorded local access resets SIFA regardless of the previous value.
A successful source transition can be applied only at its recorded source state, and then returns the recorded endpoint.
A permission marked idempotent under foreign reads really is unchanged by the source foreign-read transition.
A permission marked idempotent under foreign writes is unchanged by both foreign read and write transitions.