{"abstract":"Byte and halfword accesses at legal unaligned addresses trap.","category":"Instruction set emulation","checks":8,"contract":"Input [mem, ops]: mem is a byte list; ops [op, addr, value] with lb/lbu/lh/lhu/lw loads and sb/sh/sw stores (sizes 1/2/4). An access whose address is not a multiple of its size yields 'misaligned' (checked first); one extending past memory yields 'fault'. Data is little-endian. lb/lh/lw sign-extend from their top bit, lbu/lhu zero-extend. Stores write the low size bytes of value and yield None. Return [results, final memory].","contract_signature":"*args","evaluation_group":"w2-instruction-set-emulation-load-store","failed_approach":"Checking only 2-byte alignment lets words at addr%4==2 through.","family":"w2-instruction-set-emulation-load-store-alignment-granularity","id":"FA-89506","implementations":{"attempt":{"sha256":"d3becf6361232e5e207561b0337148504e4e837b6ea1c2513557a037050411e6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(*args):\n    mem, ops = args\n    mem = list(mem)\n    out = []\n    size = {'b': 1, 'h': 2, 'w': 4}\n    for op, addr, val in ops:\n        n = size[op[1]]\n        if addr % 2 != 0 and n > 1:\n            out.append('misaligned')\n            continue\n        if addr + n > len(mem):\n            out.append('fault')\n            continue\n        if op[0] == 's':\n            for k in range(n):\n                mem[addr + k] = (val >> (8 * k)) & 0xFF\n            out.append(None)\n        else:\n            v = 0\n            for k in range(n):\n                v |= mem[addr + k] << (8 * k)\n            if not op.endswith('u') and v >> (8 * n - 1):\n                v -= 1 << (8 * n)\n            out.append(v)\n    return [out, mem]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('signed byte load', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lb', 0, 0], ['lb', 1, 0]]], [[-127, 127], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('unsigned byte load', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lbu', 0, 0], ['lbu', 3, 0]]], [[129, 255], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('halfword loads', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 2, 0], ['lhu', 2, 0], ['lh', 6, 0], ['lhu', 4, 0]]], [[-2, 65534, 4660, 32769], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('word loads', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 0, 0], ['lw', 4, 0]]], [[-98431, 305430529], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('misaligned accesses', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 1, 0], ['lw', 2, 0], ['sh', 3, 4369], ['lb', 3, 0]]], [['misaligned', 'misaligned', 'misaligned', -1], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('store then load back', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sw', 8, 2309737966], ['lw', 8, 0], ['lbu', 9, 0], ['sh', 10, 23130], ['lh', 10, 0]]], [[None, -1985229330, 205, None, 23130], [129, 127, 254, 255, 1, 128, 52, 18, 238, 205, 90, 90]]), ('out of range', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 12, 0], ['lb', 11, 0], ['sb', 12, 1]]], [['fault', 0, 'fault'], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('byte store', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sb', 5, 511], ['lbu', 5, 0], ['lh', 4, 0]]], [[None, 255, -255], [129, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]])], [('signed byte load', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lb', 0, 0], ['lb', 1, 0]]], [[-126, 127], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('unsigned byte load', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lbu', 0, 0], ['lbu', 3, 0]]], [[130, 255], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('halfword loads', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 2, 0], ['lhu', 2, 0], ['lh', 6, 0], ['lhu', 4, 0]]], [[-2, 65534, 4660, 32769], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('word loads', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 0, 0], ['lw', 4, 0]]], [[-98430, 305430529], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('misaligned accesses', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 1, 0], ['lw', 2, 0], ['sh', 3, 4369], ['lb', 3, 0]]], [['misaligned', 'misaligned', 'misaligned', -1], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('store then load back', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sw', 8, 2309737965], ['lw', 8, 0], ['lbu', 9, 0], ['sh', 10, 23130], ['lh', 10, 0]]], [[None, -1985229331, 205, None, 23130], [130, 127, 254, 255, 1, 128, 52, 18, 237, 205, 90, 90]]), ('out of range', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 12, 0], ['lb', 11, 0], ['sb', 12, 1]]], [['fault', 0, 'fault'], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('byte store', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sb', 5, 511], ['lbu', 5, 0], ['lh', 4, 0]]], [[None, 255, -255], [130, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]])], [('signed byte load', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lb', 0, 0], ['lb', 1, 0]]], [[-125, 127], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('unsigned byte load', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lbu', 0, 0], ['lbu', 3, 0]]], [[131, 255], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('halfword loads', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 2, 0], ['lhu', 2, 0], ['lh', 6, 0], ['lhu', 4, 0]]], [[-2, 65534, 4660, 32769], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('word loads', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 0, 0], ['lw', 4, 0]]], [[-98429, 305430529], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('misaligned accesses', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 1, 0], ['lw', 2, 0], ['sh', 3, 4369], ['lb', 3, 0]]], [['misaligned', 'misaligned', 'misaligned', -1], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('store then load back', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sw', 8, 2309737964], ['lw', 8, 0], ['lbu', 9, 0], ['sh', 10, 23130], ['lh', 10, 0]]], [[None, -1985229332, 205, None, 23130], [131, 127, 254, 255, 1, 128, 52, 18, 236, 205, 90, 90]]), ('out of range', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 12, 0], ['lb', 11, 0], ['sb', 12, 1]]], [['fault', 0, 'fault'], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('byte store', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sb', 5, 511], ['lbu', 5, 0], ['lh', 4, 0]]], [[None, 255, -255], [131, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]])], [('signed byte load', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lb', 0, 0], ['lb', 1, 0]]], [[-124, 127], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('unsigned byte load', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lbu', 0, 0], ['lbu', 3, 0]]], [[132, 255], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('halfword loads', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 2, 0], ['lhu', 2, 0], ['lh', 6, 0], ['lhu', 4, 0]]], [[-2, 65534, 4660, 32769], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('word loads', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 0, 0], ['lw', 4, 0]]], [[-98428, 305430529], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('misaligned accesses', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 1, 0], ['lw', 2, 0], ['sh', 3, 4369], ['lb', 3, 0]]], [['misaligned', 'misaligned', 'misaligned', -1], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('store then load back', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sw', 8, 2309737963], ['lw', 8, 0], ['lbu', 9, 0], ['sh', 10, 23130], ['lh', 10, 0]]], [[None, -1985229333, 205, None, 23130], [132, 127, 254, 255, 1, 128, 52, 18, 235, 205, 90, 90]]), ('out of range', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 12, 0], ['lb', 11, 0], ['sb', 12, 1]]], [['fault', 0, 'fault'], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('byte store', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sb', 5, 511], ['lbu', 5, 0], ['lh', 4, 0]]], [[None, 255, -255], [132, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]])], [('signed byte load', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lb', 0, 0], ['lb', 1, 0]]], [[-123, 127], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('unsigned byte load', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lbu', 0, 0], ['lbu', 3, 0]]], [[133, 255], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('halfword loads', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 2, 0], ['lhu', 2, 0], ['lh', 6, 0], ['lhu', 4, 0]]], [[-2, 65534, 4660, 32769], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('word loads', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 0, 0], ['lw', 4, 0]]], [[-98427, 305430529], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('misaligned accesses', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 1, 0], ['lw', 2, 0], ['sh', 3, 4369], ['lb', 3, 0]]], [['misaligned', 'misaligned', 'misaligned', -1], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('store then load back', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sw', 8, 2309737962], ['lw', 8, 0], ['lbu', 9, 0], ['sh', 10, 23130], ['lh', 10, 0]]], [[None, -1985229334, 205, None, 23130], [133, 127, 254, 255, 1, 128, 52, 18, 234, 205, 90, 90]]), ('out of range', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 12, 0], ['lb', 11, 0], ['sb', 12, 1]]], [['fault', 0, 'fault'], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('byte store', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sb', 5, 511], ['lbu', 5, 0], ['lh', 4, 0]]], [[None, 255, -255], [133, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]])]]\nfor label, args, expected in fixtures[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":"6f4f625779289359bcd5846ad5a0c138c5bd924083b7c9c7486780b13b21da74","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(*args):\n    mem, ops = args\n    mem = list(mem)\n    out = []\n    size = {'b': 1, 'h': 2, 'w': 4}\n    for op, addr, val in ops:\n        n = size[op[1]]\n        if addr % 4 != 0:\n            out.append('misaligned')\n            continue\n        if addr + n > len(mem):\n            out.append('fault')\n            continue\n        if op[0] == 's':\n            for k in range(n):\n                mem[addr + k] = (val >> (8 * k)) & 0xFF\n            out.append(None)\n        else:\n            v = 0\n            for k in range(n):\n                v |= mem[addr + k] << (8 * k)\n            if not op.endswith('u') and v >> (8 * n - 1):\n                v -= 1 << (8 * n)\n            out.append(v)\n    return [out, mem]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('signed byte load', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lb', 0, 0], ['lb', 1, 0]]], [[-127, 127], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('unsigned byte load', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lbu', 0, 0], ['lbu', 3, 0]]], [[129, 255], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('halfword loads', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 2, 0], ['lhu', 2, 0], ['lh', 6, 0], ['lhu', 4, 0]]], [[-2, 65534, 4660, 32769], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('word loads', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 0, 0], ['lw', 4, 0]]], [[-98431, 305430529], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('misaligned accesses', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 1, 0], ['lw', 2, 0], ['sh', 3, 4369], ['lb', 3, 0]]], [['misaligned', 'misaligned', 'misaligned', -1], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('store then load back', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sw', 8, 2309737966], ['lw', 8, 0], ['lbu', 9, 0], ['sh', 10, 23130], ['lh', 10, 0]]], [[None, -1985229330, 205, None, 23130], [129, 127, 254, 255, 1, 128, 52, 18, 238, 205, 90, 90]]), ('out of range', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 12, 0], ['lb', 11, 0], ['sb', 12, 1]]], [['fault', 0, 'fault'], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('byte store', [[129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sb', 5, 511], ['lbu', 5, 0], ['lh', 4, 0]]], [[None, 255, -255], [129, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]])], [('signed byte load', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lb', 0, 0], ['lb', 1, 0]]], [[-126, 127], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('unsigned byte load', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lbu', 0, 0], ['lbu', 3, 0]]], [[130, 255], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('halfword loads', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 2, 0], ['lhu', 2, 0], ['lh', 6, 0], ['lhu', 4, 0]]], [[-2, 65534, 4660, 32769], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('word loads', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 0, 0], ['lw', 4, 0]]], [[-98430, 305430529], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('misaligned accesses', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 1, 0], ['lw', 2, 0], ['sh', 3, 4369], ['lb', 3, 0]]], [['misaligned', 'misaligned', 'misaligned', -1], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('store then load back', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sw', 8, 2309737965], ['lw', 8, 0], ['lbu', 9, 0], ['sh', 10, 23130], ['lh', 10, 0]]], [[None, -1985229331, 205, None, 23130], [130, 127, 254, 255, 1, 128, 52, 18, 237, 205, 90, 90]]), ('out of range', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 12, 0], ['lb', 11, 0], ['sb', 12, 1]]], [['fault', 0, 'fault'], [130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('byte store', [[130, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sb', 5, 511], ['lbu', 5, 0], ['lh', 4, 0]]], [[None, 255, -255], [130, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]])], [('signed byte load', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lb', 0, 0], ['lb', 1, 0]]], [[-125, 127], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('unsigned byte load', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lbu', 0, 0], ['lbu', 3, 0]]], [[131, 255], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('halfword loads', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 2, 0], ['lhu', 2, 0], ['lh', 6, 0], ['lhu', 4, 0]]], [[-2, 65534, 4660, 32769], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('word loads', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 0, 0], ['lw', 4, 0]]], [[-98429, 305430529], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('misaligned accesses', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 1, 0], ['lw', 2, 0], ['sh', 3, 4369], ['lb', 3, 0]]], [['misaligned', 'misaligned', 'misaligned', -1], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('store then load back', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sw', 8, 2309737964], ['lw', 8, 0], ['lbu', 9, 0], ['sh', 10, 23130], ['lh', 10, 0]]], [[None, -1985229332, 205, None, 23130], [131, 127, 254, 255, 1, 128, 52, 18, 236, 205, 90, 90]]), ('out of range', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 12, 0], ['lb', 11, 0], ['sb', 12, 1]]], [['fault', 0, 'fault'], [131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('byte store', [[131, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sb', 5, 511], ['lbu', 5, 0], ['lh', 4, 0]]], [[None, 255, -255], [131, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]])], [('signed byte load', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lb', 0, 0], ['lb', 1, 0]]], [[-124, 127], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('unsigned byte load', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lbu', 0, 0], ['lbu', 3, 0]]], [[132, 255], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('halfword loads', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 2, 0], ['lhu', 2, 0], ['lh', 6, 0], ['lhu', 4, 0]]], [[-2, 65534, 4660, 32769], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('word loads', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 0, 0], ['lw', 4, 0]]], [[-98428, 305430529], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('misaligned accesses', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 1, 0], ['lw', 2, 0], ['sh', 3, 4369], ['lb', 3, 0]]], [['misaligned', 'misaligned', 'misaligned', -1], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('store then load back', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sw', 8, 2309737963], ['lw', 8, 0], ['lbu', 9, 0], ['sh', 10, 23130], ['lh', 10, 0]]], [[None, -1985229333, 205, None, 23130], [132, 127, 254, 255, 1, 128, 52, 18, 235, 205, 90, 90]]), ('out of range', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 12, 0], ['lb', 11, 0], ['sb', 12, 1]]], [['fault', 0, 'fault'], [132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('byte store', [[132, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sb', 5, 511], ['lbu', 5, 0], ['lh', 4, 0]]], [[None, 255, -255], [132, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]])], [('signed byte load', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lb', 0, 0], ['lb', 1, 0]]], [[-123, 127], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('unsigned byte load', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lbu', 0, 0], ['lbu', 3, 0]]], [[133, 255], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('halfword loads', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 2, 0], ['lhu', 2, 0], ['lh', 6, 0], ['lhu', 4, 0]]], [[-2, 65534, 4660, 32769], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('word loads', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 0, 0], ['lw', 4, 0]]], [[-98427, 305430529], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('misaligned accesses', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lh', 1, 0], ['lw', 2, 0], ['sh', 3, 4369], ['lb', 3, 0]]], [['misaligned', 'misaligned', 'misaligned', -1], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('store then load back', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sw', 8, 2309737962], ['lw', 8, 0], ['lbu', 9, 0], ['sh', 10, 23130], ['lh', 10, 0]]], [[None, -1985229334, 205, None, 23130], [133, 127, 254, 255, 1, 128, 52, 18, 234, 205, 90, 90]]), ('out of range', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['lw', 12, 0], ['lb', 11, 0], ['sb', 12, 1]]], [['fault', 0, 'fault'], [133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]]), ('byte store', [[133, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0], [['sb', 5, 511], ['lbu', 5, 0], ['lh', 4, 0]]], [[None, 255, -255], [133, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]])]]\nfor label, args, expected in fixtures[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 emulator rule; the instruction semantics are a stipulated contract inspired by common ISAs and are not a claim of cycle-exact or architectural conformance. 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-instruction-set-emulation-load-store-alignment-granularity","generated_at":"2026-09-29T14:51:18.061340+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Memory access emulation must reproduce endianness, extension and alignment traps bit-exactly.","root_cause":"Alignment is checked against 4 regardless of access size.","sha256":"273f08c0283e3cdae0b5a03f3e0d98afb15aa77597dc1ee22634bc852277385c","title":"All accesses require word alignment · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":40.825,"exit_code":1,"observations":[{"actual":[[-127,127],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"signed byte load","expected":[[-127,127],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":true},{"actual":[[129,255],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"unsigned byte load","expected":[[129,255],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":true},{"actual":[[-2,65534,4660,32769],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"halfword loads","expected":[[-2,65534,4660,32769],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":true},{"actual":[[-98431,305430529],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"word loads","expected":[[-98431,305430529],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":true},{"actual":[["misaligned",-2147352578,"misaligned",-1],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"misaligned accesses","expected":[["misaligned","misaligned","misaligned",-1],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":false},{"actual":[[null,-1985229330,205,null,23130],[129,127,254,255,1,128,52,18,238,205,90,90]],"check":"store then load back","expected":[[null,-1985229330,205,null,23130],[129,127,254,255,1,128,52,18,238,205,90,90]],"passed":true},{"actual":[["fault",0,"fault"],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"out of range","expected":[["fault",0,"fault"],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":true},{"actual":[[null,255,-255],[129,127,254,255,1,255,52,18,0,0,0,0]],"check":"byte store","expected":[[null,255,-255],[129,127,254,255,1,255,52,18,0,0,0,0]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"signed byte load\", \"actual\": [[-127, 127], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[-127, 127], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": true}, {\"check\": \"unsigned byte load\", \"actual\": [[129, 255], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[129, 255], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": true}, {\"check\": \"halfword loads\", \"actual\": [[-2, 65534, 4660, 32769], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[-2, 65534, 4660, 32769], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": true}, {\"check\": \"word loads\", \"actual\": [[-98431, 305430529], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[-98431, 305430529], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": true}, {\"check\": \"misaligned accesses\", \"actual\": [[\"misaligned\", -2147352578, \"misaligned\", -1], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[\"misaligned\", \"misaligned\", \"misaligned\", -1], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": false}, {\"check\": \"store then load back\", \"actual\": [[null, -1985229330, 205, null, 23130], [129, 127, 254, 255, 1, 128, 52, 18, 238, 205, 90, 90]], \"expected\": [[null, -1985229330, 205, null, 23130], [129, 127, 254, 255, 1, 128, 52, 18, 238, 205, 90, 90]], \"passed\": true}, {\"check\": \"out of range\", \"actual\": [[\"fault\", 0, \"fault\"], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[\"fault\", 0, \"fault\"], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": true}, {\"check\": \"byte store\", \"actual\": [[null, 255, -255], [129, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]], \"expected\": [[null, 255, -255], [129, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.859,"exit_code":1,"observations":[{"actual":[[-127,"misaligned"],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"signed byte load","expected":[[-127,127],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":false},{"actual":[[129,"misaligned"],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"unsigned byte load","expected":[[129,255],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":false},{"actual":[["misaligned","misaligned","misaligned",32769],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"halfword loads","expected":[[-2,65534,4660,32769],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":false},{"actual":[[-98431,305430529],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"word loads","expected":[[-98431,305430529],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":true},{"actual":[["misaligned","misaligned","misaligned","misaligned"],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"misaligned accesses","expected":[["misaligned","misaligned","misaligned",-1],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":false},{"actual":[[null,-1985229330,"misaligned","misaligned","misaligned"],[129,127,254,255,1,128,52,18,238,205,171,137]],"check":"store then load back","expected":[[null,-1985229330,205,null,23130],[129,127,254,255,1,128,52,18,238,205,90,90]],"passed":false},{"actual":[["fault","misaligned","fault"],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"out of range","expected":[["fault",0,"fault"],[129,127,254,255,1,128,52,18,0,0,0,0]],"passed":false},{"actual":[["misaligned","misaligned",-32767],[129,127,254,255,1,128,52,18,0,0,0,0]],"check":"byte store","expected":[[null,255,-255],[129,127,254,255,1,255,52,18,0,0,0,0]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"signed byte load\", \"actual\": [[-127, \"misaligned\"], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[-127, 127], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": false}, {\"check\": \"unsigned byte load\", \"actual\": [[129, \"misaligned\"], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[129, 255], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": false}, {\"check\": \"halfword loads\", \"actual\": [[\"misaligned\", \"misaligned\", \"misaligned\", 32769], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[-2, 65534, 4660, 32769], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": false}, {\"check\": \"word loads\", \"actual\": [[-98431, 305430529], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[-98431, 305430529], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": true}, {\"check\": \"misaligned accesses\", \"actual\": [[\"misaligned\", \"misaligned\", \"misaligned\", \"misaligned\"], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[\"misaligned\", \"misaligned\", \"misaligned\", -1], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": false}, {\"check\": \"store then load back\", \"actual\": [[null, -1985229330, \"misaligned\", \"misaligned\", \"misaligned\"], [129, 127, 254, 255, 1, 128, 52, 18, 238, 205, 171, 137]], \"expected\": [[null, -1985229330, 205, null, 23130], [129, 127, 254, 255, 1, 128, 52, 18, 238, 205, 90, 90]], \"passed\": false}, {\"check\": \"out of range\", \"actual\": [[\"fault\", \"misaligned\", \"fault\"], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[\"fault\", 0, \"fault\"], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"passed\": false}, {\"check\": \"byte store\", \"actual\": [[\"misaligned\", \"misaligned\", -32767], [129, 127, 254, 255, 1, 128, 52, 18, 0, 0, 0, 0]], \"expected\": [[null, 255, -255], [129, 127, 254, 255, 1, 255, 52, 18, 0, 0, 0, 0]], \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}