Skip to main content

rapx/analysis/points_to/
slot.rs

1/// Identifies a memory slot: a local variable with optional field projections.
2#[derive(Debug, Clone, Hash, PartialEq, Eq)]
3pub struct Slot {
4    pub local: usize,
5    pub fields: Vec<usize>,
6}
7
8impl Slot {
9    pub fn new(local: usize) -> Self {
10        Slot {
11            local,
12            fields: Vec::new(),
13        }
14    }
15
16    pub fn project(&self, field_idx: usize) -> Self {
17        let mut fields = self.fields.clone();
18        fields.push(field_idx);
19        Slot {
20            local: self.local,
21            fields,
22        }
23    }
24
25    pub fn from_mir_place(place: &rustc_middle::mir::Place) -> Self {
26        let local = place.local.as_usize();
27        let fields: Vec<usize> = place
28            .projection
29            .iter()
30            .filter_map(|elem| match elem {
31                rustc_middle::mir::ProjectionElem::Field(idx, _) => Some(idx.as_usize()),
32                _ => None,
33            })
34            .collect();
35        Slot { local, fields }
36    }
37}
38
39/// An abstract memory location a pointer can point to.
40#[derive(Debug, Clone, Hash, PartialEq, Eq)]
41pub enum AbstractLoc {
42    Slot(Slot),
43    Null,
44}