aboutsummaryrefslogtreecommitdiff
path: root/tests/drivers/analyzer_property_test.py
blob: d816f47a407226d18fd1bce776a9293b10ff4769 (plain) (blame)
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)')