FA-43776 / Borrow checking / Open access
Strided borrow footprint substitutes contiguous positions · case 01
Strided borrow footprint substitutes contiguous positions.
ROOT CAUSE
The static analyzer mishandles strided footprint: strided borrow footprint substitutes contiguous positions.
VERIFIED REPAIR
Apply the specified transfer or inference rule at this site: if set(d['stride_indices'])!=set(d['enumerated']): errors.append('strided-footprint').
Unsuccessful approach: The partial repair uses if len(d['stride_indices'])!=len(d['enumerated']): errors.append('strided-footprint'), which still violates the stipulated analysis contract.
Case contract
Validate static proof objects for splitting borrowed slices. Bounds are half-open; split point lies in 0..length; children exactly partition parent; exclusive children disjoint; every child retains parent owner and generation; dynamic indices need inequality proof; empty children confer no element access; strided loans include every enumerated element; reverse views retain original element addresses; consuming split removes parent exclusive capability. Input is a fully explicit descriptor of the stated toy IR. Return rule identifiers in declaration order; absent optional obligations use the provided neutral defaults. No rule is an assertion about a production language.
Why this case matters
A finite offline static-analysis model of ownership and borrowing; it does not execute the analyzed program.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
errors=[]
if d['split']<0 or d['split']>d['length']: errors.append('split-boundary')
if set(d['left'])|set(d['right'])!=set(d['parent']): errors.append('partition-completeness')
if bool(set(d['exclusive_a'])&set(d['exclusive_b'])): errors.append('exclusive-disjoint')
if any(x!=d['owner'] for x in d['child_owners']): errors.append('owner-preservation')
if any(x!=d['generation'] for x in d['child_generations']): errors.append('generation-preservation')
if d['dynamic_pair'] and not d['inequality_proven']: errors.append('dynamic-disjoint-proof')
if bool(d['empty_access']): errors.append('empty-access')
if False: errors.append('strided-footprint')
if d['reverse_actual']!=d['reverse_expected']: errors.append('reverse-addresses')
if d['consuming'] and d['parent_unique_live']: errors.append('split-consumption')
return errors
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
base={'length': 0, 'split': 0, 'left': [], 'right': [], 'parent': [], 'exclusive_a': [], 'exclusive_b': [], 'child_owners': [], 'owner': None, 'child_generations': [], 'generation': 0, 'dynamic_pair': False, 'inequality_proven': True, 'empty_access': [], 'stride_indices': [], 'enumerated': [], 'reverse_expected': [], 'reverse_actual': [], 'consuming': False, 'parent_unique_live': False}
check('well formed empty obligations',solve(base),[])
check('split-boundary regression 0', solve(dict(base, **({'length':N,'split':N+1}))), ['split-boundary'])
check('split-boundary regression 1', solve(dict(base, **({'length':N+1,'split':N+2}))), ['split-boundary'])
check('partition-completeness regression 0', solve(dict(base, **({'parent':list(range(N+1)),'left':[0]}))), ['partition-completeness'])
check('partition-completeness regression 1', solve(dict(base, **({'parent':[N,N+1],'right':[N]}))), ['partition-completeness'])
check('exclusive-disjoint regression 0', solve(dict(base, **({'exclusive_a':[N,N+1],'exclusive_b':[N+1]}))), ['exclusive-disjoint'])
check('exclusive-disjoint regression 1', solve(dict(base, **({'exclusive_a':[N],'exclusive_b':[N,N+1]}))), ['exclusive-disjoint'])
check('owner-preservation regression 0', solve(dict(base, **({'owner':'r','child_owners':['r','s']}))), ['owner-preservation'])
check('owner-preservation regression 1', solve(dict(base, **({'owner':N,'child_owners':[N,N+1]}))), ['owner-preservation'])
check('generation-preservation regression 0', solve(dict(base, **({'generation':N+1,'child_generations':[N]}))), ['generation-preservation'])
check('generation-preservation regression 1', solve(dict(base, **({'generation':N+2,'child_generations':[N+1]}))), ['generation-preservation'])
check('dynamic-disjoint-proof regression 0', solve(dict(base, **({'dynamic_pair':True,'inequality_proven':False,'length':N}))), ['dynamic-disjoint-proof'])
check('dynamic-disjoint-proof regression 1', solve(dict(base, **({'dynamic_pair':True,'inequality_proven':False,'length':N+1}))), ['dynamic-disjoint-proof'])
check('empty-access regression 0', solve(dict(base, **({'empty_access':[N]}))), ['empty-access'])
check('empty-access regression 1', solve(dict(base, **({'empty_access':[N+1]}))), ['empty-access'])
check('strided-footprint regression 0', solve(dict(base, **({'stride_indices':[N,N+2],'enumerated':[N,N+1]}))), ['strided-footprint'])
check('strided-footprint regression 1', solve(dict(base, **({'stride_indices':[N,N+3],'enumerated':[N,N+2]}))), ['strided-footprint'])
check('reverse-addresses regression 0', solve(dict(base, **({'reverse_actual':[N,N+1],'reverse_expected':[N+1,N]}))), ['reverse-addresses'])
check('reverse-addresses regression 1', solve(dict(base, **({'reverse_actual':[N,N+1,N+2],'reverse_expected':[N+2,N+1,N]}))), ['reverse-addresses'])
check('split-consumption regression 0', solve(dict(base, **({'consuming':True,'parent_unique_live':True,'parent':[N],'left':[N]}))), ['split-consumption'])
check('split-consumption regression 1', solve(dict(base, **({'consuming':True,'parent_unique_live':True,'parent':[N+1],'right':[N+1]}))), ['split-consumption'])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| well formed empty obligations | [] | [] | Passed |
| split-boundary regression 0 | ['split-boundary'] | ['split-boundary'] | Passed |
| split-boundary regression 1 | ['split-boundary'] | ['split-boundary'] | Passed |
| partition-completeness regression 0 | ['partition-completeness'] | ['partition-completeness'] | Passed |
| partition-completeness regression 1 | ['partition-completeness'] | ['partition-completeness'] | Passed |
| exclusive-disjoint regression 0 | ['exclusive-disjoint'] | ['exclusive-disjoint'] | Passed |
| exclusive-disjoint regression 1 | ['exclusive-disjoint'] | ['exclusive-disjoint'] | Passed |
| owner-preservation regression 0 | ['owner-preservation'] | ['owner-preservation'] | Passed |
| owner-preservation regression 1 | ['owner-preservation'] | ['owner-preservation'] | Passed |
| generation-preservation regression 0 | ['generation-preservation'] | ['generation-preservation'] | Passed |
| generation-preservation regression 1 | ['generation-preservation'] | ['generation-preservation'] | Passed |
| dynamic-disjoint-proof regression 0 | ['dynamic-disjoint-proof'] | ['dynamic-disjoint-proof'] | Passed |
| dynamic-disjoint-proof regression 1 | ['dynamic-disjoint-proof'] | ['dynamic-disjoint-proof'] | Passed |
| empty-access regression 0 | ['empty-access'] | ['empty-access'] | Passed |
| empty-access regression 1 | ['empty-access'] | ['empty-access'] | Passed |
| strided-footprint regression 0 | [] | ['strided-footprint'] | Failed |
| strided-footprint regression 1 | [] | ['strided-footprint'] | Failed |
| reverse-addresses regression 0 | ['reverse-addresses'] | ['reverse-addresses'] | Passed |
| reverse-addresses regression 1 | ['reverse-addresses'] | ['reverse-addresses'] | Passed |
| split-consumption regression 0 | ['split-consumption'] | ['split-consumption'] | Passed |
| split-consumption regression 1 | ['split-consumption'] | ['split-consumption'] | Passed |
SHA-256 / ca9b9d56fe5b836a36a31b4421af02339dfcbe7146ff8d3040cb2a5cc44c99a2
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
errors=[]
if d['split']<0 or d['split']>d['length']: errors.append('split-boundary')
if set(d['left'])|set(d['right'])!=set(d['parent']): errors.append('partition-completeness')
if bool(set(d['exclusive_a'])&set(d['exclusive_b'])): errors.append('exclusive-disjoint')
if any(x!=d['owner'] for x in d['child_owners']): errors.append('owner-preservation')
if any(x!=d['generation'] for x in d['child_generations']): errors.append('generation-preservation')
if d['dynamic_pair'] and not d['inequality_proven']: errors.append('dynamic-disjoint-proof')
if bool(d['empty_access']): errors.append('empty-access')
if len(d['stride_indices'])!=len(d['enumerated']): errors.append('strided-footprint')
if d['reverse_actual']!=d['reverse_expected']: errors.append('reverse-addresses')
if d['consuming'] and d['parent_unique_live']: errors.append('split-consumption')
return errors
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
base={'length': 0, 'split': 0, 'left': [], 'right': [], 'parent': [], 'exclusive_a': [], 'exclusive_b': [], 'child_owners': [], 'owner': None, 'child_generations': [], 'generation': 0, 'dynamic_pair': False, 'inequality_proven': True, 'empty_access': [], 'stride_indices': [], 'enumerated': [], 'reverse_expected': [], 'reverse_actual': [], 'consuming': False, 'parent_unique_live': False}
check('well formed empty obligations',solve(base),[])
check('split-boundary regression 0', solve(dict(base, **({'length':N,'split':N+1}))), ['split-boundary'])
check('split-boundary regression 1', solve(dict(base, **({'length':N+1,'split':N+2}))), ['split-boundary'])
check('partition-completeness regression 0', solve(dict(base, **({'parent':list(range(N+1)),'left':[0]}))), ['partition-completeness'])
check('partition-completeness regression 1', solve(dict(base, **({'parent':[N,N+1],'right':[N]}))), ['partition-completeness'])
check('exclusive-disjoint regression 0', solve(dict(base, **({'exclusive_a':[N,N+1],'exclusive_b':[N+1]}))), ['exclusive-disjoint'])
check('exclusive-disjoint regression 1', solve(dict(base, **({'exclusive_a':[N],'exclusive_b':[N,N+1]}))), ['exclusive-disjoint'])
check('owner-preservation regression 0', solve(dict(base, **({'owner':'r','child_owners':['r','s']}))), ['owner-preservation'])
check('owner-preservation regression 1', solve(dict(base, **({'owner':N,'child_owners':[N,N+1]}))), ['owner-preservation'])
check('generation-preservation regression 0', solve(dict(base, **({'generation':N+1,'child_generations':[N]}))), ['generation-preservation'])
check('generation-preservation regression 1', solve(dict(base, **({'generation':N+2,'child_generations':[N+1]}))), ['generation-preservation'])
check('dynamic-disjoint-proof regression 0', solve(dict(base, **({'dynamic_pair':True,'inequality_proven':False,'length':N}))), ['dynamic-disjoint-proof'])
check('dynamic-disjoint-proof regression 1', solve(dict(base, **({'dynamic_pair':True,'inequality_proven':False,'length':N+1}))), ['dynamic-disjoint-proof'])
check('empty-access regression 0', solve(dict(base, **({'empty_access':[N]}))), ['empty-access'])
check('empty-access regression 1', solve(dict(base, **({'empty_access':[N+1]}))), ['empty-access'])
check('strided-footprint regression 0', solve(dict(base, **({'stride_indices':[N,N+2],'enumerated':[N,N+1]}))), ['strided-footprint'])
check('strided-footprint regression 1', solve(dict(base, **({'stride_indices':[N,N+3],'enumerated':[N,N+2]}))), ['strided-footprint'])
check('reverse-addresses regression 0', solve(dict(base, **({'reverse_actual':[N,N+1],'reverse_expected':[N+1,N]}))), ['reverse-addresses'])
check('reverse-addresses regression 1', solve(dict(base, **({'reverse_actual':[N,N+1,N+2],'reverse_expected':[N+2,N+1,N]}))), ['reverse-addresses'])
check('split-consumption regression 0', solve(dict(base, **({'consuming':True,'parent_unique_live':True,'parent':[N],'left':[N]}))), ['split-consumption'])
check('split-consumption regression 1', solve(dict(base, **({'consuming':True,'parent_unique_live':True,'parent':[N+1],'right':[N+1]}))), ['split-consumption'])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| well formed empty obligations | [] | [] | Passed |
| split-boundary regression 0 | ['split-boundary'] | ['split-boundary'] | Passed |
| split-boundary regression 1 | ['split-boundary'] | ['split-boundary'] | Passed |
| partition-completeness regression 0 | ['partition-completeness'] | ['partition-completeness'] | Passed |
| partition-completeness regression 1 | ['partition-completeness'] | ['partition-completeness'] | Passed |
| exclusive-disjoint regression 0 | ['exclusive-disjoint'] | ['exclusive-disjoint'] | Passed |
| exclusive-disjoint regression 1 | ['exclusive-disjoint'] | ['exclusive-disjoint'] | Passed |
| owner-preservation regression 0 | ['owner-preservation'] | ['owner-preservation'] | Passed |
| owner-preservation regression 1 | ['owner-preservation'] | ['owner-preservation'] | Passed |
| generation-preservation regression 0 | ['generation-preservation'] | ['generation-preservation'] | Passed |
| generation-preservation regression 1 | ['generation-preservation'] | ['generation-preservation'] | Passed |
| dynamic-disjoint-proof regression 0 | ['dynamic-disjoint-proof'] | ['dynamic-disjoint-proof'] | Passed |
| dynamic-disjoint-proof regression 1 | ['dynamic-disjoint-proof'] | ['dynamic-disjoint-proof'] | Passed |
| empty-access regression 0 | ['empty-access'] | ['empty-access'] | Passed |
| empty-access regression 1 | ['empty-access'] | ['empty-access'] | Passed |
| strided-footprint regression 0 | [] | ['strided-footprint'] | Failed |
| strided-footprint regression 1 | [] | ['strided-footprint'] | Failed |
| reverse-addresses regression 0 | ['reverse-addresses'] | ['reverse-addresses'] | Passed |
| reverse-addresses regression 1 | ['reverse-addresses'] | ['reverse-addresses'] | Passed |
| split-consumption regression 0 | ['split-consumption'] | ['split-consumption'] | Passed |
| split-consumption regression 1 | ['split-consumption'] | ['split-consumption'] | Passed |
SHA-256 / 161e6255b8dc568879bde6c0899dc2582a83010dc4f68e675a8faccdf94fefe0
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
errors=[]
if d['split']<0 or d['split']>d['length']: errors.append('split-boundary')
if set(d['left'])|set(d['right'])!=set(d['parent']): errors.append('partition-completeness')
if bool(set(d['exclusive_a'])&set(d['exclusive_b'])): errors.append('exclusive-disjoint')
if any(x!=d['owner'] for x in d['child_owners']): errors.append('owner-preservation')
if any(x!=d['generation'] for x in d['child_generations']): errors.append('generation-preservation')
if d['dynamic_pair'] and not d['inequality_proven']: errors.append('dynamic-disjoint-proof')
if bool(d['empty_access']): errors.append('empty-access')
if set(d['stride_indices'])!=set(d['enumerated']): errors.append('strided-footprint')
if d['reverse_actual']!=d['reverse_expected']: errors.append('reverse-addresses')
if d['consuming'] and d['parent_unique_live']: errors.append('split-consumption')
return errors
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
base={'length': 0, 'split': 0, 'left': [], 'right': [], 'parent': [], 'exclusive_a': [], 'exclusive_b': [], 'child_owners': [], 'owner': None, 'child_generations': [], 'generation': 0, 'dynamic_pair': False, 'inequality_proven': True, 'empty_access': [], 'stride_indices': [], 'enumerated': [], 'reverse_expected': [], 'reverse_actual': [], 'consuming': False, 'parent_unique_live': False}
check('well formed empty obligations',solve(base),[])
check('split-boundary regression 0', solve(dict(base, **({'length':N,'split':N+1}))), ['split-boundary'])
check('split-boundary regression 1', solve(dict(base, **({'length':N+1,'split':N+2}))), ['split-boundary'])
check('partition-completeness regression 0', solve(dict(base, **({'parent':list(range(N+1)),'left':[0]}))), ['partition-completeness'])
check('partition-completeness regression 1', solve(dict(base, **({'parent':[N,N+1],'right':[N]}))), ['partition-completeness'])
check('exclusive-disjoint regression 0', solve(dict(base, **({'exclusive_a':[N,N+1],'exclusive_b':[N+1]}))), ['exclusive-disjoint'])
check('exclusive-disjoint regression 1', solve(dict(base, **({'exclusive_a':[N],'exclusive_b':[N,N+1]}))), ['exclusive-disjoint'])
check('owner-preservation regression 0', solve(dict(base, **({'owner':'r','child_owners':['r','s']}))), ['owner-preservation'])
check('owner-preservation regression 1', solve(dict(base, **({'owner':N,'child_owners':[N,N+1]}))), ['owner-preservation'])
check('generation-preservation regression 0', solve(dict(base, **({'generation':N+1,'child_generations':[N]}))), ['generation-preservation'])
check('generation-preservation regression 1', solve(dict(base, **({'generation':N+2,'child_generations':[N+1]}))), ['generation-preservation'])
check('dynamic-disjoint-proof regression 0', solve(dict(base, **({'dynamic_pair':True,'inequality_proven':False,'length':N}))), ['dynamic-disjoint-proof'])
check('dynamic-disjoint-proof regression 1', solve(dict(base, **({'dynamic_pair':True,'inequality_proven':False,'length':N+1}))), ['dynamic-disjoint-proof'])
check('empty-access regression 0', solve(dict(base, **({'empty_access':[N]}))), ['empty-access'])
check('empty-access regression 1', solve(dict(base, **({'empty_access':[N+1]}))), ['empty-access'])
check('strided-footprint regression 0', solve(dict(base, **({'stride_indices':[N,N+2],'enumerated':[N,N+1]}))), ['strided-footprint'])
check('strided-footprint regression 1', solve(dict(base, **({'stride_indices':[N,N+3],'enumerated':[N,N+2]}))), ['strided-footprint'])
check('reverse-addresses regression 0', solve(dict(base, **({'reverse_actual':[N,N+1],'reverse_expected':[N+1,N]}))), ['reverse-addresses'])
check('reverse-addresses regression 1', solve(dict(base, **({'reverse_actual':[N,N+1,N+2],'reverse_expected':[N+2,N+1,N]}))), ['reverse-addresses'])
check('split-consumption regression 0', solve(dict(base, **({'consuming':True,'parent_unique_live':True,'parent':[N],'left':[N]}))), ['split-consumption'])
check('split-consumption regression 1', solve(dict(base, **({'consuming':True,'parent_unique_live':True,'parent':[N+1],'right':[N+1]}))), ['split-consumption'])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| well formed empty obligations | [] | [] | Passed |
| split-boundary regression 0 | ['split-boundary'] | ['split-boundary'] | Passed |
| split-boundary regression 1 | ['split-boundary'] | ['split-boundary'] | Passed |
| partition-completeness regression 0 | ['partition-completeness'] | ['partition-completeness'] | Passed |
| partition-completeness regression 1 | ['partition-completeness'] | ['partition-completeness'] | Passed |
| exclusive-disjoint regression 0 | ['exclusive-disjoint'] | ['exclusive-disjoint'] | Passed |
| exclusive-disjoint regression 1 | ['exclusive-disjoint'] | ['exclusive-disjoint'] | Passed |
| owner-preservation regression 0 | ['owner-preservation'] | ['owner-preservation'] | Passed |
| owner-preservation regression 1 | ['owner-preservation'] | ['owner-preservation'] | Passed |
| generation-preservation regression 0 | ['generation-preservation'] | ['generation-preservation'] | Passed |
| generation-preservation regression 1 | ['generation-preservation'] | ['generation-preservation'] | Passed |
| dynamic-disjoint-proof regression 0 | ['dynamic-disjoint-proof'] | ['dynamic-disjoint-proof'] | Passed |
| dynamic-disjoint-proof regression 1 | ['dynamic-disjoint-proof'] | ['dynamic-disjoint-proof'] | Passed |
| empty-access regression 0 | ['empty-access'] | ['empty-access'] | Passed |
| empty-access regression 1 | ['empty-access'] | ['empty-access'] | Passed |
| strided-footprint regression 0 | ['strided-footprint'] | ['strided-footprint'] | Passed |
| strided-footprint regression 1 | ['strided-footprint'] | ['strided-footprint'] | Passed |
| reverse-addresses regression 0 | ['reverse-addresses'] | ['reverse-addresses'] | Passed |
| reverse-addresses regression 1 | ['reverse-addresses'] | ['reverse-addresses'] | Passed |
| split-consumption regression 0 | ['split-consumption'] | ['split-consumption'] | Passed |
| split-consumption regression 1 | ['split-consumption'] | ['split-consumption'] | Passed |
SHA-256 / a27a0cdd3aa8345549d6b4891eb8008c1ca87ebf35df567260dba4b119bc4c87
Verification & scope
The explicitly stated toy language is the complete scope; this is not a production compiler or a claim about Rust semantics. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:44:05.419260+00:00.
Case digest / 99f298ac70752267c09533a06ddab54a7391ebba028e8b45fdf96c5691c20f8f