Skip to content

Commit ca68658

Browse files
committed
Add pointer reference tests and pointer equality semantics
1 parent 2fb4f61 commit ca68658

File tree

5 files changed

+206
-0
lines changed

5 files changed

+206
-0
lines changed

kmir/src/kmir/kdist/mir-semantics/rt/data.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1762,6 +1762,39 @@ The unary operation `unOpPtrMetadata`, when given a reference or pointer to a sl
17621762
// could add a rule for cases without metadata
17631763
```
17641764

1765+
#### Pointer equality
1766+
1767+
Raw pointer comparisons ignore mutability, but require the address and metadata to match.
1768+
1769+
```k
1770+
syntax Bool ::= #ptrLocalEq(Value, Value) [function, total]
1771+
1772+
rule #ptrLocalEq(
1773+
PtrLocal(OFFSET1, PLACE1, _, PTRMETA1),
1774+
PtrLocal(OFFSET2, PLACE2, _, PTRMETA2)
1775+
)
1776+
=> OFFSET1 ==Int OFFSET2
1777+
andBool PLACE1 ==K PLACE2
1778+
andBool PTRMETA1 ==K PTRMETA2
1779+
rule #ptrLocalEq(_, _) => false [owise]
1780+
1781+
rule #applyBinOp(
1782+
binOpEq,
1783+
PtrLocal(_, _, _, _) #as PTR1,
1784+
PtrLocal(_, _, _, _) #as PTR2,
1785+
_
1786+
)
1787+
=> BoolVal(#ptrLocalEq(PTR1, PTR2))
1788+
1789+
rule #applyBinOp(
1790+
binOpNe,
1791+
PtrLocal(_, _, _, _) #as PTR1,
1792+
PtrLocal(_, _, _, _) #as PTR2,
1793+
_
1794+
)
1795+
=> BoolVal(notBool #ptrLocalEq(PTR1, PTR2))
1796+
```
1797+
17651798

17661799

17671800
#### Pointer Artithmetic
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
fn aliasing_refs_have_same_pointer() {
2+
let value = 42_i32;
3+
let first = &value;
4+
let second = &value;
5+
6+
assert!((first as *const i32) == (second as *const i32));
7+
assert!(std::ptr::eq(first, second));
8+
}
9+
10+
fn distinct_locals_have_distinct_pointers() {
11+
let left = 10_i32;
12+
let right = 10_i32;
13+
14+
assert!((&left as *const i32) != (&right as *const i32));
15+
}
16+
17+
fn array_element_addresses_are_distinct() {
18+
let items = [3_u8, 5, 7];
19+
let first = &items[0];
20+
let first_again = &items[0];
21+
let second = &items[1];
22+
23+
assert!((first as *const u8) == (first_again as *const u8));
24+
assert!((first as *const u8) != (second as *const u8));
25+
}
26+
27+
fn reborrow_mut_pointer_roundtrip() {
28+
let mut byte = 0_u8;
29+
let ptr = &mut byte as *mut u8;
30+
31+
unsafe {
32+
*ptr = 1;
33+
}
34+
35+
assert_eq!(byte, 1);
36+
}
37+
38+
fn main() {
39+
aliasing_refs_have_same_pointer();
40+
distinct_locals_have_distinct_pointers();
41+
array_element_addresses_are_distinct();
42+
reborrow_mut_pointer_roundtrip();
43+
}

kmir/src/tests/integration/data/exec-smir/pointers/ref_ptr_cases.smir.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)