{"abstract":"Freshly allocated objects are swept at the end of the cycle in which they were created.","category":"Garbage collector invariants","checks":7,"contract":"Incremental tri-colour mark-sweep with a Dijkstra insertion barrier. start: every object white, roots shaded grey. mark k: up to k worklist steps (pop a grey object, shade its white children, blacken it). store src i dst: while marking, shade dst before writing. alloc id k: new object with k null fields, black while marking (allocate-black), otherwise white. root id: add a root, shaded if marking. unroot id removes a root. finish: drain the worklist, free all white objects, stop marking. Return the freed ids per finish and the surviving ids.","evaluation_group":"w2-garbage-collector-invariants-incremental-insertion-barrier","failed_approach":"Testing whether the worklist is non-empty misses allocations after the worklist has drained but before finish.","family":"w2-garbage-collector-invariants-incremental-insertion-barrier-allocation-colour","id":"FA-90346","implementations":{"attempt":{"sha256":"dcf7bb62852b95208265ba833e34feeeb38ea7a566f3276ebc9a1beb26336740","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(heap, roots, events):\n    heap = {k: list(v) for k, v in heap.items()}\n    roots = list(roots)\n    color = {}\n    grey = []\n    marking = False\n    log = []\n    def shade(o):\n        if o is not None and color.get(o, 'white') == 'white':\n            color[o] = 'grey'\n            grey.append(o)\n    def step():\n        o = grey.pop()\n        for c in heap[o]:\n            shade(c)\n        color[o] = 'black'\n    for ev in events:\n        op = ev[0]\n        if op == 'start':\n            color = {o: 'white' for o in heap}\n            grey.clear()\n            marking = True\n            for r in roots:\n                shade(r)\n        elif op == 'mark':\n            for _ in range(ev[1]):\n                if grey:\n                    step()\n        elif op == 'store':\n            if marking:\n                shade(ev[3])\n            heap[ev[1]][ev[2]] = ev[3]\n        elif op == 'alloc':\n            heap[ev[1]] = [None] * ev[2]\n            color[ev[1]] = 'black' if grey else 'white'\n        elif op == 'root':\n            roots.append(ev[1])\n            if marking:\n                shade(ev[1])\n        elif op == 'unroot':\n            roots.remove(ev[1])\n        else:\n            while grey:\n                step()\n            dead = sorted(o for o in heap if color.get(o, 'white') == 'white')\n            for o in dead:\n                del heap[o]\n            marking = False\n            log.append(dead)\n    return {'freed': log, 'live': sorted(heap)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression: pointer stored into a black object',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['mark', 1], ['store', 11, 1, 14], ['finish']]),\n   {'freed': [[16]], 'live': [11, 12, 13, 14, 15]}),\n  ('allocation after the worklist drained',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['mark', 10], ['alloc', 17, 1], ['finish']]),\n   {'freed': [[14, 15, 16]], 'live': [11, 12, 13, 17]}),\n  ('second cycle starts from all-white',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['finish'], ['unroot', 11], ['start'], ['finish']]),\n   {'freed': [[14, 15, 16], [11, 12, 13]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]}, [11], [['start'], ['finish']]),\n   {'freed': [[14, 15, 16]], 'live': [11, 12, 13]}),\n  ('root registered while marking',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['mark', 10], ['root', 16], ['finish']]),\n   {'freed': [[14, 15]], 'live': [11, 12, 13, 16]}),\n  ('store before marking needs no barrier',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['alloc', 18, 1], ['store', 18, 0, 14], ['root', 18], ['start'], ['finish']]),\n   {'freed': [[16]], 'live': [11, 12, 13, 14, 15, 18]}),\n  ('control: unreachable cycle is freed',\n   ({11: [12], 12: [11], 13: []}, [13], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[11, 12]], 'live': [13]})],\n [('regression: pointer stored into a black object',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['mark', 1], ['store', 21, 1, 24], ['finish']]),\n   {'freed': [[26]], 'live': [21, 22, 23, 24, 25]}),\n  ('allocation after the worklist drained',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['mark', 10], ['alloc', 27, 1], ['finish']]),\n   {'freed': [[24, 25, 26]], 'live': [21, 22, 23, 27]}),\n  ('second cycle starts from all-white',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['finish'], ['unroot', 21], ['start'], ['finish']]),\n   {'freed': [[24, 25, 26], [21, 22, 23]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]}, [21], [['start'], ['finish']]),\n   {'freed': [[24, 25, 26]], 'live': [21, 22, 23]}),\n  ('root registered while marking',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['mark', 10], ['root', 26], ['finish']]),\n   {'freed': [[24, 25]], 'live': [21, 22, 23, 26]}),\n  ('store before marking needs no barrier',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['alloc', 28, 1], ['store', 28, 0, 24], ['root', 28], ['start'], ['finish']]),\n   {'freed': [[26]], 'live': [21, 22, 23, 24, 25, 28]}),\n  ('control: unreachable cycle is freed',\n   ({21: [22], 22: [21], 23: []}, [23], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[21, 22]], 'live': [23]})],\n [('regression: pointer stored into a black object',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['mark', 1], ['store', 31, 1, 34], ['finish']]),\n   {'freed': [[36]], 'live': [31, 32, 33, 34, 35]}),\n  ('allocation after the worklist drained',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['mark', 10], ['alloc', 37, 1], ['finish']]),\n   {'freed': [[34, 35, 36]], 'live': [31, 32, 33, 37]}),\n  ('second cycle starts from all-white',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['finish'], ['unroot', 31], ['start'], ['finish']]),\n   {'freed': [[34, 35, 36], [31, 32, 33]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]}, [31], [['start'], ['finish']]),\n   {'freed': [[34, 35, 36]], 'live': [31, 32, 33]}),\n  ('root registered while marking',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['mark', 10], ['root', 36], ['finish']]),\n   {'freed': [[34, 35]], 'live': [31, 32, 33, 36]}),\n  ('store before marking needs no barrier',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['alloc', 38, 1], ['store', 38, 0, 34], ['root', 38], ['start'], ['finish']]),\n   {'freed': [[36]], 'live': [31, 32, 33, 34, 35, 38]}),\n  ('control: unreachable cycle is freed',\n   ({31: [32], 32: [31], 33: []}, [33], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[31, 32]], 'live': [33]})],\n [('regression: pointer stored into a black object',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['mark', 1], ['store', 41, 1, 44], ['finish']]),\n   {'freed': [[46]], 'live': [41, 42, 43, 44, 45]}),\n  ('allocation after the worklist drained',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['mark', 10], ['alloc', 47, 1], ['finish']]),\n   {'freed': [[44, 45, 46]], 'live': [41, 42, 43, 47]}),\n  ('second cycle starts from all-white',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['finish'], ['unroot', 41], ['start'], ['finish']]),\n   {'freed': [[44, 45, 46], [41, 42, 43]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]}, [41], [['start'], ['finish']]),\n   {'freed': [[44, 45, 46]], 'live': [41, 42, 43]}),\n  ('root registered while marking',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['mark', 10], ['root', 46], ['finish']]),\n   {'freed': [[44, 45]], 'live': [41, 42, 43, 46]}),\n  ('store before marking needs no barrier',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['alloc', 48, 1], ['store', 48, 0, 44], ['root', 48], ['start'], ['finish']]),\n   {'freed': [[46]], 'live': [41, 42, 43, 44, 45, 48]}),\n  ('control: unreachable cycle is freed',\n   ({41: [42], 42: [41], 43: []}, [43], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[41, 42]], 'live': [43]})],\n [('regression: pointer stored into a black object',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['mark', 1], ['store', 51, 1, 54], ['finish']]),\n   {'freed': [[56]], 'live': [51, 52, 53, 54, 55]}),\n  ('allocation after the worklist drained',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['mark', 10], ['alloc', 57, 1], ['finish']]),\n   {'freed': [[54, 55, 56]], 'live': [51, 52, 53, 57]}),\n  ('second cycle starts from all-white',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['finish'], ['unroot', 51], ['start'], ['finish']]),\n   {'freed': [[54, 55, 56], [51, 52, 53]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]}, [51], [['start'], ['finish']]),\n   {'freed': [[54, 55, 56]], 'live': [51, 52, 53]}),\n  ('root registered while marking',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['mark', 10], ['root', 56], ['finish']]),\n   {'freed': [[54, 55]], 'live': [51, 52, 53, 56]}),\n  ('store before marking needs no barrier',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['alloc', 58, 1], ['store', 58, 0, 54], ['root', 58], ['start'], ['finish']]),\n   {'freed': [[56]], 'live': [51, 52, 53, 54, 55, 58]}),\n  ('control: unreachable cycle is freed',\n   ({51: [52], 52: [51], 53: []}, [53], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[51, 52]], 'live': [53]})]]\nfor label, args, expected in cases[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"1f23e7706926af511c2f845e4c43d115e09ed0186a4698cebcb7f4c86346b59b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(heap, roots, events):\n    heap = {k: list(v) for k, v in heap.items()}\n    roots = list(roots)\n    color = {}\n    grey = []\n    marking = False\n    log = []\n    def shade(o):\n        if o is not None and color.get(o, 'white') == 'white':\n            color[o] = 'grey'\n            grey.append(o)\n    def step():\n        o = grey.pop()\n        for c in heap[o]:\n            shade(c)\n        color[o] = 'black'\n    for ev in events:\n        op = ev[0]\n        if op == 'start':\n            color = {o: 'white' for o in heap}\n            grey.clear()\n            marking = True\n            for r in roots:\n                shade(r)\n        elif op == 'mark':\n            for _ in range(ev[1]):\n                if grey:\n                    step()\n        elif op == 'store':\n            if marking:\n                shade(ev[3])\n            heap[ev[1]][ev[2]] = ev[3]\n        elif op == 'alloc':\n            heap[ev[1]] = [None] * ev[2]\n            color[ev[1]] = 'white'\n        elif op == 'root':\n            roots.append(ev[1])\n            if marking:\n                shade(ev[1])\n        elif op == 'unroot':\n            roots.remove(ev[1])\n        else:\n            while grey:\n                step()\n            dead = sorted(o for o in heap if color.get(o, 'white') == 'white')\n            for o in dead:\n                del heap[o]\n            marking = False\n            log.append(dead)\n    return {'freed': log, 'live': sorted(heap)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression: pointer stored into a black object',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['mark', 1], ['store', 11, 1, 14], ['finish']]),\n   {'freed': [[16]], 'live': [11, 12, 13, 14, 15]}),\n  ('allocation after the worklist drained',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['mark', 10], ['alloc', 17, 1], ['finish']]),\n   {'freed': [[14, 15, 16]], 'live': [11, 12, 13, 17]}),\n  ('second cycle starts from all-white',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['finish'], ['unroot', 11], ['start'], ['finish']]),\n   {'freed': [[14, 15, 16], [11, 12, 13]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]}, [11], [['start'], ['finish']]),\n   {'freed': [[14, 15, 16]], 'live': [11, 12, 13]}),\n  ('root registered while marking',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['mark', 10], ['root', 16], ['finish']]),\n   {'freed': [[14, 15]], 'live': [11, 12, 13, 16]}),\n  ('store before marking needs no barrier',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['alloc', 18, 1], ['store', 18, 0, 14], ['root', 18], ['start'], ['finish']]),\n   {'freed': [[16]], 'live': [11, 12, 13, 14, 15, 18]}),\n  ('control: unreachable cycle is freed',\n   ({11: [12], 12: [11], 13: []}, [13], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[11, 12]], 'live': [13]})],\n [('regression: pointer stored into a black object',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['mark', 1], ['store', 21, 1, 24], ['finish']]),\n   {'freed': [[26]], 'live': [21, 22, 23, 24, 25]}),\n  ('allocation after the worklist drained',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['mark', 10], ['alloc', 27, 1], ['finish']]),\n   {'freed': [[24, 25, 26]], 'live': [21, 22, 23, 27]}),\n  ('second cycle starts from all-white',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['finish'], ['unroot', 21], ['start'], ['finish']]),\n   {'freed': [[24, 25, 26], [21, 22, 23]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]}, [21], [['start'], ['finish']]),\n   {'freed': [[24, 25, 26]], 'live': [21, 22, 23]}),\n  ('root registered while marking',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['mark', 10], ['root', 26], ['finish']]),\n   {'freed': [[24, 25]], 'live': [21, 22, 23, 26]}),\n  ('store before marking needs no barrier',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['alloc', 28, 1], ['store', 28, 0, 24], ['root', 28], ['start'], ['finish']]),\n   {'freed': [[26]], 'live': [21, 22, 23, 24, 25, 28]}),\n  ('control: unreachable cycle is freed',\n   ({21: [22], 22: [21], 23: []}, [23], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[21, 22]], 'live': [23]})],\n [('regression: pointer stored into a black object',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['mark', 1], ['store', 31, 1, 34], ['finish']]),\n   {'freed': [[36]], 'live': [31, 32, 33, 34, 35]}),\n  ('allocation after the worklist drained',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['mark', 10], ['alloc', 37, 1], ['finish']]),\n   {'freed': [[34, 35, 36]], 'live': [31, 32, 33, 37]}),\n  ('second cycle starts from all-white',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['finish'], ['unroot', 31], ['start'], ['finish']]),\n   {'freed': [[34, 35, 36], [31, 32, 33]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]}, [31], [['start'], ['finish']]),\n   {'freed': [[34, 35, 36]], 'live': [31, 32, 33]}),\n  ('root registered while marking',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['mark', 10], ['root', 36], ['finish']]),\n   {'freed': [[34, 35]], 'live': [31, 32, 33, 36]}),\n  ('store before marking needs no barrier',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['alloc', 38, 1], ['store', 38, 0, 34], ['root', 38], ['start'], ['finish']]),\n   {'freed': [[36]], 'live': [31, 32, 33, 34, 35, 38]}),\n  ('control: unreachable cycle is freed',\n   ({31: [32], 32: [31], 33: []}, [33], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[31, 32]], 'live': [33]})],\n [('regression: pointer stored into a black object',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['mark', 1], ['store', 41, 1, 44], ['finish']]),\n   {'freed': [[46]], 'live': [41, 42, 43, 44, 45]}),\n  ('allocation after the worklist drained',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['mark', 10], ['alloc', 47, 1], ['finish']]),\n   {'freed': [[44, 45, 46]], 'live': [41, 42, 43, 47]}),\n  ('second cycle starts from all-white',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['finish'], ['unroot', 41], ['start'], ['finish']]),\n   {'freed': [[44, 45, 46], [41, 42, 43]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]}, [41], [['start'], ['finish']]),\n   {'freed': [[44, 45, 46]], 'live': [41, 42, 43]}),\n  ('root registered while marking',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['mark', 10], ['root', 46], ['finish']]),\n   {'freed': [[44, 45]], 'live': [41, 42, 43, 46]}),\n  ('store before marking needs no barrier',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['alloc', 48, 1], ['store', 48, 0, 44], ['root', 48], ['start'], ['finish']]),\n   {'freed': [[46]], 'live': [41, 42, 43, 44, 45, 48]}),\n  ('control: unreachable cycle is freed',\n   ({41: [42], 42: [41], 43: []}, [43], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[41, 42]], 'live': [43]})],\n [('regression: pointer stored into a black object',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['mark', 1], ['store', 51, 1, 54], ['finish']]),\n   {'freed': [[56]], 'live': [51, 52, 53, 54, 55]}),\n  ('allocation after the worklist drained',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['mark', 10], ['alloc', 57, 1], ['finish']]),\n   {'freed': [[54, 55, 56]], 'live': [51, 52, 53, 57]}),\n  ('second cycle starts from all-white',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['finish'], ['unroot', 51], ['start'], ['finish']]),\n   {'freed': [[54, 55, 56], [51, 52, 53]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]}, [51], [['start'], ['finish']]),\n   {'freed': [[54, 55, 56]], 'live': [51, 52, 53]}),\n  ('root registered while marking',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['mark', 10], ['root', 56], ['finish']]),\n   {'freed': [[54, 55]], 'live': [51, 52, 53, 56]}),\n  ('store before marking needs no barrier',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['alloc', 58, 1], ['store', 58, 0, 54], ['root', 58], ['start'], ['finish']]),\n   {'freed': [[56]], 'live': [51, 52, 53, 54, 55, 58]}),\n  ('control: unreachable cycle is freed',\n   ({51: [52], 52: [51], 53: []}, [53], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[51, 52]], 'live': [53]})]]\nfor label, args, expected in cases[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"8f3efc50d5ba915d8b6b33558f8a86076df02688e86989e23ba494a82a0a2883","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(heap, roots, events):\n    heap = {k: list(v) for k, v in heap.items()}\n    roots = list(roots)\n    color = {}\n    grey = []\n    marking = False\n    log = []\n    def shade(o):\n        if o is not None and color.get(o, 'white') == 'white':\n            color[o] = 'grey'\n            grey.append(o)\n    def step():\n        o = grey.pop()\n        for c in heap[o]:\n            shade(c)\n        color[o] = 'black'\n    for ev in events:\n        op = ev[0]\n        if op == 'start':\n            color = {o: 'white' for o in heap}\n            grey.clear()\n            marking = True\n            for r in roots:\n                shade(r)\n        elif op == 'mark':\n            for _ in range(ev[1]):\n                if grey:\n                    step()\n        elif op == 'store':\n            if marking:\n                shade(ev[3])\n            heap[ev[1]][ev[2]] = ev[3]\n        elif op == 'alloc':\n            heap[ev[1]] = [None] * ev[2]\n            color[ev[1]] = 'black' if marking else 'white'\n        elif op == 'root':\n            roots.append(ev[1])\n            if marking:\n                shade(ev[1])\n        elif op == 'unroot':\n            roots.remove(ev[1])\n        else:\n            while grey:\n                step()\n            dead = sorted(o for o in heap if color.get(o, 'white') == 'white')\n            for o in dead:\n                del heap[o]\n            marking = False\n            log.append(dead)\n    return {'freed': log, 'live': sorted(heap)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression: pointer stored into a black object',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['mark', 1], ['store', 11, 1, 14], ['finish']]),\n   {'freed': [[16]], 'live': [11, 12, 13, 14, 15]}),\n  ('allocation after the worklist drained',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['mark', 10], ['alloc', 17, 1], ['finish']]),\n   {'freed': [[14, 15, 16]], 'live': [11, 12, 13, 17]}),\n  ('second cycle starts from all-white',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['finish'], ['unroot', 11], ['start'], ['finish']]),\n   {'freed': [[14, 15, 16], [11, 12, 13]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]}, [11], [['start'], ['finish']]),\n   {'freed': [[14, 15, 16]], 'live': [11, 12, 13]}),\n  ('root registered while marking',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['start'], ['mark', 10], ['root', 16], ['finish']]),\n   {'freed': [[14, 15]], 'live': [11, 12, 13, 16]}),\n  ('store before marking needs no barrier',\n   ({11: [12, None], 12: [13], 13: [], 14: [15], 15: [], 16: [11]},\n    [11],\n    [['alloc', 18, 1], ['store', 18, 0, 14], ['root', 18], ['start'], ['finish']]),\n   {'freed': [[16]], 'live': [11, 12, 13, 14, 15, 18]}),\n  ('control: unreachable cycle is freed',\n   ({11: [12], 12: [11], 13: []}, [13], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[11, 12]], 'live': [13]})],\n [('regression: pointer stored into a black object',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['mark', 1], ['store', 21, 1, 24], ['finish']]),\n   {'freed': [[26]], 'live': [21, 22, 23, 24, 25]}),\n  ('allocation after the worklist drained',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['mark', 10], ['alloc', 27, 1], ['finish']]),\n   {'freed': [[24, 25, 26]], 'live': [21, 22, 23, 27]}),\n  ('second cycle starts from all-white',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['finish'], ['unroot', 21], ['start'], ['finish']]),\n   {'freed': [[24, 25, 26], [21, 22, 23]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]}, [21], [['start'], ['finish']]),\n   {'freed': [[24, 25, 26]], 'live': [21, 22, 23]}),\n  ('root registered while marking',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['start'], ['mark', 10], ['root', 26], ['finish']]),\n   {'freed': [[24, 25]], 'live': [21, 22, 23, 26]}),\n  ('store before marking needs no barrier',\n   ({21: [22, None], 22: [23], 23: [], 24: [25], 25: [], 26: [21]},\n    [21],\n    [['alloc', 28, 1], ['store', 28, 0, 24], ['root', 28], ['start'], ['finish']]),\n   {'freed': [[26]], 'live': [21, 22, 23, 24, 25, 28]}),\n  ('control: unreachable cycle is freed',\n   ({21: [22], 22: [21], 23: []}, [23], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[21, 22]], 'live': [23]})],\n [('regression: pointer stored into a black object',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['mark', 1], ['store', 31, 1, 34], ['finish']]),\n   {'freed': [[36]], 'live': [31, 32, 33, 34, 35]}),\n  ('allocation after the worklist drained',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['mark', 10], ['alloc', 37, 1], ['finish']]),\n   {'freed': [[34, 35, 36]], 'live': [31, 32, 33, 37]}),\n  ('second cycle starts from all-white',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['finish'], ['unroot', 31], ['start'], ['finish']]),\n   {'freed': [[34, 35, 36], [31, 32, 33]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]}, [31], [['start'], ['finish']]),\n   {'freed': [[34, 35, 36]], 'live': [31, 32, 33]}),\n  ('root registered while marking',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['start'], ['mark', 10], ['root', 36], ['finish']]),\n   {'freed': [[34, 35]], 'live': [31, 32, 33, 36]}),\n  ('store before marking needs no barrier',\n   ({31: [32, None], 32: [33], 33: [], 34: [35], 35: [], 36: [31]},\n    [31],\n    [['alloc', 38, 1], ['store', 38, 0, 34], ['root', 38], ['start'], ['finish']]),\n   {'freed': [[36]], 'live': [31, 32, 33, 34, 35, 38]}),\n  ('control: unreachable cycle is freed',\n   ({31: [32], 32: [31], 33: []}, [33], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[31, 32]], 'live': [33]})],\n [('regression: pointer stored into a black object',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['mark', 1], ['store', 41, 1, 44], ['finish']]),\n   {'freed': [[46]], 'live': [41, 42, 43, 44, 45]}),\n  ('allocation after the worklist drained',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['mark', 10], ['alloc', 47, 1], ['finish']]),\n   {'freed': [[44, 45, 46]], 'live': [41, 42, 43, 47]}),\n  ('second cycle starts from all-white',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['finish'], ['unroot', 41], ['start'], ['finish']]),\n   {'freed': [[44, 45, 46], [41, 42, 43]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]}, [41], [['start'], ['finish']]),\n   {'freed': [[44, 45, 46]], 'live': [41, 42, 43]}),\n  ('root registered while marking',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['start'], ['mark', 10], ['root', 46], ['finish']]),\n   {'freed': [[44, 45]], 'live': [41, 42, 43, 46]}),\n  ('store before marking needs no barrier',\n   ({41: [42, None], 42: [43], 43: [], 44: [45], 45: [], 46: [41]},\n    [41],\n    [['alloc', 48, 1], ['store', 48, 0, 44], ['root', 48], ['start'], ['finish']]),\n   {'freed': [[46]], 'live': [41, 42, 43, 44, 45, 48]}),\n  ('control: unreachable cycle is freed',\n   ({41: [42], 42: [41], 43: []}, [43], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[41, 42]], 'live': [43]})],\n [('regression: pointer stored into a black object',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['mark', 1], ['store', 51, 1, 54], ['finish']]),\n   {'freed': [[56]], 'live': [51, 52, 53, 54, 55]}),\n  ('allocation after the worklist drained',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['mark', 10], ['alloc', 57, 1], ['finish']]),\n   {'freed': [[54, 55, 56]], 'live': [51, 52, 53, 57]}),\n  ('second cycle starts from all-white',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['finish'], ['unroot', 51], ['start'], ['finish']]),\n   {'freed': [[54, 55, 56], [51, 52, 53]], 'live': []}),\n  ('finish drains outstanding grey objects',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]}, [51], [['start'], ['finish']]),\n   {'freed': [[54, 55, 56]], 'live': [51, 52, 53]}),\n  ('root registered while marking',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['start'], ['mark', 10], ['root', 56], ['finish']]),\n   {'freed': [[54, 55]], 'live': [51, 52, 53, 56]}),\n  ('store before marking needs no barrier',\n   ({51: [52, None], 52: [53], 53: [], 54: [55], 55: [], 56: [51]},\n    [51],\n    [['alloc', 58, 1], ['store', 58, 0, 54], ['root', 58], ['start'], ['finish']]),\n   {'freed': [[56]], 'live': [51, 52, 53, 54, 55, 58]}),\n  ('control: unreachable cycle is freed',\n   ({51: [52], 52: [51], 53: []}, [53], [['start'], ['mark', 1], ['finish']]),\n   {'freed': [[51, 52]], 'live': [53]})]]\nfor label, args, expected in cases[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"A deterministic, bounded teaching model of one garbage-collector mechanism with stipulated rules; it is not a production collector and claims no conformance to any particular runtime. 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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-garbage-collector-invariants-incremental-insertion-barrier-allocation-colour","generated_at":"2026-09-29T14:51:25.821494+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Incremental collectors are only safe if barriers and allocation colour preserve the tri-colour invariant.","repair":"Allocate black while a marking cycle is active.","root_cause":"Allocation ignores the marking phase and always colours new objects white.","sha256":"054ce6bf0b2c454bf94b15393b57f4c52b363e4a28b42198dd12d5bc02daf765","title":"Insertion barrier: objects allocated during marking start white · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.714,"exit_code":1,"observations":[{"actual":{"freed":[[16]],"live":[11,12,13,14,15]},"check":"regression: pointer stored into a black object","expected":{"freed":[[16]],"live":[11,12,13,14,15]},"passed":true},{"actual":{"freed":[[14,15,16,17]],"live":[11,12,13]},"check":"allocation after the worklist drained","expected":{"freed":[[14,15,16]],"live":[11,12,13,17]},"passed":false},{"actual":{"freed":[[14,15,16],[11,12,13]],"live":[]},"check":"second cycle starts from all-white","expected":{"freed":[[14,15,16],[11,12,13]],"live":[]},"passed":true},{"actual":{"freed":[[14,15,16]],"live":[11,12,13]},"check":"finish drains outstanding grey objects","expected":{"freed":[[14,15,16]],"live":[11,12,13]},"passed":true},{"actual":{"freed":[[14,15]],"live":[11,12,13,16]},"check":"root registered while marking","expected":{"freed":[[14,15]],"live":[11,12,13,16]},"passed":true},{"actual":{"freed":[[16]],"live":[11,12,13,14,15,18]},"check":"store before marking needs no barrier","expected":{"freed":[[16]],"live":[11,12,13,14,15,18]},"passed":true},{"actual":{"freed":[[11,12]],"live":[13]},"check":"control: unreachable cycle is freed","expected":{"freed":[[11,12]],"live":[13]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: pointer stored into a black object\", \"actual\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15]}, \"expected\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15]}, \"passed\": true}, {\"check\": \"allocation after the worklist drained\", \"actual\": {\"freed\": [[14, 15, 16, 17]], \"live\": [11, 12, 13]}, \"expected\": {\"freed\": [[14, 15, 16]], \"live\": [11, 12, 13, 17]}, \"passed\": false}, {\"check\": \"second cycle starts from all-white\", \"actual\": {\"freed\": [[14, 15, 16], [11, 12, 13]], \"live\": []}, \"expected\": {\"freed\": [[14, 15, 16], [11, 12, 13]], \"live\": []}, \"passed\": true}, {\"check\": \"finish drains outstanding grey objects\", \"actual\": {\"freed\": [[14, 15, 16]], \"live\": [11, 12, 13]}, \"expected\": {\"freed\": [[14, 15, 16]], \"live\": [11, 12, 13]}, \"passed\": true}, {\"check\": \"root registered while marking\", \"actual\": {\"freed\": [[14, 15]], \"live\": [11, 12, 13, 16]}, \"expected\": {\"freed\": [[14, 15]], \"live\": [11, 12, 13, 16]}, \"passed\": true}, {\"check\": \"store before marking needs no barrier\", \"actual\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15, 18]}, \"expected\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15, 18]}, \"passed\": true}, {\"check\": \"control: unreachable cycle is freed\", \"actual\": {\"freed\": [[11, 12]], \"live\": [13]}, \"expected\": {\"freed\": [[11, 12]], \"live\": [13]}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.32,"exit_code":1,"observations":[{"actual":{"freed":[[16]],"live":[11,12,13,14,15]},"check":"regression: pointer stored into a black object","expected":{"freed":[[16]],"live":[11,12,13,14,15]},"passed":true},{"actual":{"freed":[[14,15,16,17]],"live":[11,12,13]},"check":"allocation after the worklist drained","expected":{"freed":[[14,15,16]],"live":[11,12,13,17]},"passed":false},{"actual":{"freed":[[14,15,16],[11,12,13]],"live":[]},"check":"second cycle starts from all-white","expected":{"freed":[[14,15,16],[11,12,13]],"live":[]},"passed":true},{"actual":{"freed":[[14,15,16]],"live":[11,12,13]},"check":"finish drains outstanding grey objects","expected":{"freed":[[14,15,16]],"live":[11,12,13]},"passed":true},{"actual":{"freed":[[14,15]],"live":[11,12,13,16]},"check":"root registered while marking","expected":{"freed":[[14,15]],"live":[11,12,13,16]},"passed":true},{"actual":{"freed":[[16]],"live":[11,12,13,14,15,18]},"check":"store before marking needs no barrier","expected":{"freed":[[16]],"live":[11,12,13,14,15,18]},"passed":true},{"actual":{"freed":[[11,12]],"live":[13]},"check":"control: unreachable cycle is freed","expected":{"freed":[[11,12]],"live":[13]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: pointer stored into a black object\", \"actual\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15]}, \"expected\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15]}, \"passed\": true}, {\"check\": \"allocation after the worklist drained\", \"actual\": {\"freed\": [[14, 15, 16, 17]], \"live\": [11, 12, 13]}, \"expected\": {\"freed\": [[14, 15, 16]], \"live\": [11, 12, 13, 17]}, \"passed\": false}, {\"check\": \"second cycle starts from all-white\", \"actual\": {\"freed\": [[14, 15, 16], [11, 12, 13]], \"live\": []}, \"expected\": {\"freed\": [[14, 15, 16], [11, 12, 13]], \"live\": []}, \"passed\": true}, {\"check\": \"finish drains outstanding grey objects\", \"actual\": {\"freed\": [[14, 15, 16]], \"live\": [11, 12, 13]}, \"expected\": {\"freed\": [[14, 15, 16]], \"live\": [11, 12, 13]}, \"passed\": true}, {\"check\": \"root registered while marking\", \"actual\": {\"freed\": [[14, 15]], \"live\": [11, 12, 13, 16]}, \"expected\": {\"freed\": [[14, 15]], \"live\": [11, 12, 13, 16]}, \"passed\": true}, {\"check\": \"store before marking needs no barrier\", \"actual\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15, 18]}, \"expected\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15, 18]}, \"passed\": true}, {\"check\": \"control: unreachable cycle is freed\", \"actual\": {\"freed\": [[11, 12]], \"live\": [13]}, \"expected\": {\"freed\": [[11, 12]], \"live\": [13]}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.09,"exit_code":0,"observations":[{"actual":{"freed":[[16]],"live":[11,12,13,14,15]},"check":"regression: pointer stored into a black object","expected":{"freed":[[16]],"live":[11,12,13,14,15]},"passed":true},{"actual":{"freed":[[14,15,16]],"live":[11,12,13,17]},"check":"allocation after the worklist drained","expected":{"freed":[[14,15,16]],"live":[11,12,13,17]},"passed":true},{"actual":{"freed":[[14,15,16],[11,12,13]],"live":[]},"check":"second cycle starts from all-white","expected":{"freed":[[14,15,16],[11,12,13]],"live":[]},"passed":true},{"actual":{"freed":[[14,15,16]],"live":[11,12,13]},"check":"finish drains outstanding grey objects","expected":{"freed":[[14,15,16]],"live":[11,12,13]},"passed":true},{"actual":{"freed":[[14,15]],"live":[11,12,13,16]},"check":"root registered while marking","expected":{"freed":[[14,15]],"live":[11,12,13,16]},"passed":true},{"actual":{"freed":[[16]],"live":[11,12,13,14,15,18]},"check":"store before marking needs no barrier","expected":{"freed":[[16]],"live":[11,12,13,14,15,18]},"passed":true},{"actual":{"freed":[[11,12]],"live":[13]},"check":"control: unreachable cycle is freed","expected":{"freed":[[11,12]],"live":[13]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: pointer stored into a black object\", \"actual\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15]}, \"expected\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15]}, \"passed\": true}, {\"check\": \"allocation after the worklist drained\", \"actual\": {\"freed\": [[14, 15, 16]], \"live\": [11, 12, 13, 17]}, \"expected\": {\"freed\": [[14, 15, 16]], \"live\": [11, 12, 13, 17]}, \"passed\": true}, {\"check\": \"second cycle starts from all-white\", \"actual\": {\"freed\": [[14, 15, 16], [11, 12, 13]], \"live\": []}, \"expected\": {\"freed\": [[14, 15, 16], [11, 12, 13]], \"live\": []}, \"passed\": true}, {\"check\": \"finish drains outstanding grey objects\", \"actual\": {\"freed\": [[14, 15, 16]], \"live\": [11, 12, 13]}, \"expected\": {\"freed\": [[14, 15, 16]], \"live\": [11, 12, 13]}, \"passed\": true}, {\"check\": \"root registered while marking\", \"actual\": {\"freed\": [[14, 15]], \"live\": [11, 12, 13, 16]}, \"expected\": {\"freed\": [[14, 15]], \"live\": [11, 12, 13, 16]}, \"passed\": true}, {\"check\": \"store before marking needs no barrier\", \"actual\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15, 18]}, \"expected\": {\"freed\": [[16]], \"live\": [11, 12, 13, 14, 15, 18]}, \"passed\": true}, {\"check\": \"control: unreachable cycle is freed\", \"actual\": {\"freed\": [[11, 12]], \"live\": [13]}, \"expected\": {\"freed\": [[11, 12]], \"live\": [13]}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}