Module bytecode::access_path

source ·
Expand description

This file contains an abstraction of concrete access paths, which are canonical names for a particular cell in memory. Some examples of concrete paths are:

  • 0x7/M::T/f (i.e., the field f of the M::T resource stored at address 0x7
  • Formal(0)/[2] (i.e., the value stored at index 2 of the array bound the 0th formal of the current procedure) An abstract path is similar; it consists of the following components:
  • A root, which is either an abstract address or a local
  • Zero or more offsets, where an offset is a field, an unknown vector index, or an abstract struct type

Abstract addresses are a set containing constants and abstract access paths read from the environment. For example, in the following Move code:

 struct S { f: u64 }

 fun foo(x: S) {
   let a = if (*) { 0x1 } else { *&x.f }
    ... // program point 1
 }

, the value of a will be { 0x1, Footprint(x/f) } at program point 1.

Structs

Enums

  • Building block for abstraction of addresses
  • Offset of an access path: either a field, vector index, or global key
  • Root of an access path: a global, local, or return variable

Traits

  • Trait for a domain that can be viewed as a partial map from access paths to values and values can be deleted using their access paths
  • Trait for an abstract domain that can represent footprint values

Type Definitions

  • Abstraction of an address: non-empty set of constant or footprint address values