1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#!/usr/bin/env python3
"""deterministic safe/invalid neighbors for ownership and projection analysis."""
import argparse
import random
import subprocess
parser = argparse.ArgumentParser()
parser.add_argument('host')
parser.add_argument('--cases', type=int, default=32)
args = parser.parse_args()
rng = random.Random(0xB0770)
for i in range(args.cases):
n = rng.randrange(1, 12); at = rng.randrange(n)
prefix = f'include rt; int* saved; fn main() {{ let p = rt.new(int, {n}); p[{at}] = {i}; '
variants = [
(f'return p[{at}]; }}', True),
(f'saved = p; return saved[{at}]; }}', True),
(f'saved = p; return p[{at}]; }}', False),
(f'rt.free(p); return p[{at}]; }}', False),
(f'int* q = p; rt.free(p); return q[{at}]; }}', False),
]
for tail, accepted in variants:
src = prefix + tail
r = subprocess.run([args.host], input=src.encode(), capture_output=True, timeout=5)
text = (r.stdout + r.stderr).decode(errors='replace')
error = 'zc:' in text or r.returncode != 0
assert r.returncode >= 0 and (not error) == accepted, (i, accepted, src, text)
print(f'ok {args.cases * 5} generated ownership accept/reject neighbors (seed 0xB0770)')
|