{"record":{"id":"e64d381493a61014","repo":"NationalSecurityAgency/ghidra","slug":"invalid-memory-state","errorCode":null,"errorMessage":"Invalid memory state: {}","messagePattern":"Invalid memory state: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Debugger-rmi-trace/src/main/py/src/ghidratrace/client.py","lineNumber":363,"sourceCode":"    def create_overlay_space(self, base: str, name: str) -> Union[\n            None, RemoteResult[Any, None]]:\n        if name in self.overlays:\n            return None\n        result = self.client._create_overlay_space(self.id, base, name)\n        self.overlays.add(name)\n        return result\n\n    def put_bytes(self, address: Address, data: bytes,\n                  snap: Optional[int] = None) -> Union[\n            int, RemoteResult[Any, int]]:\n        if snap is None:\n            snap = self.snap()\n        return self.client._put_bytes(self.id, snap, address, data)\n\n    @staticmethod\n    def validate_state(state) -> None:\n        if not state in ('unknown', 'known', 'error'):\n            raise ValueError(\"Invalid memory state: {}\".format(state))\n\n    def set_memory_state(self, range: AddressRange, state: str,\n                         snap: Optional[int] = None) -> Union[\n            None, RemoteResult[Any, None]]:\n        if snap is None:\n            snap = self.snap()\n        return self.client._set_memory_state(self.id, snap, range, state)\n\n    def delete_bytes(self, range: AddressRange, snap:\n                     Optional[int] = None) -> Union[\n            None, RemoteResult[Any, None]]:\n        if snap is None:\n            snap = self.snap()\n        return self.client._delete_bytes(self.id, snap, range)\n\n    def put_registers(self, space: str, values: Iterable[RegVal],\n                      snap: Optional[int] = None) -> Union[\n            List[str], RemoteResult[Any, List[str]]]:","sourceCodeStart":345,"sourceCodeEnd":381,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Debugger-rmi-trace/src/main/py/src/ghidratrace/client.py#L345-L381","documentation":"Raised by Trace.validate_state() when the supplied memory-state string is not one of 'unknown', 'known', or 'error'. These three states classify a memory range's validity in a Ghidra trace. set_memory_state() calls validate_state() to guard the value before sending it over RMI, so any unrecognized string is rejected before serialization.","triggerScenarios":"Calling trace.set_memory_state(range, 'cached'), passing 'True'/'TRUE', typos like 'know', or forwarding a state pulled from another tool's vocabulary (e.g. 'dirty', 'valid', 'invalid').","commonSituations":"Mapping between a debugger backend's memory-state enum and Ghidra's three-state vocabulary; user-typed config; code that assumed boolean or extra states exist.","solutions":["Use the exact literals: 'unknown', 'known', or 'error' (lowercase).","Define a module-level constant or Enum and source every call from it so typos are compile-time caught.","Add an allowlist check: if state not in ('unknown','known','error'): before calling set_memory_state."],"exampleFix":"# before\ntrace.set_memory_state(rng, 'valid')\n# after\nVALID_STATES = ('unknown', 'known', 'error')\nassert state in VALID_STATES, f'bad state {state!r}'\ntrace.set_memory_state(rng, state)","handlingStrategy":"validation","validationCode":"MEM_STATES = ('unknown', 'known', 'error')\nif state not in MEM_STATES:\n    raise ValueError(f'Invalid memory state {state!r}; use one of {MEM_STATES}')","typeGuard":"def is_valid_mem_state(s) -> bool:\n    return s in ('unknown', 'known', 'error')","tryCatchPattern":null,"preventionTips":["Centralize the three valid states in one constant.","Never accept arbitrary strings from backends without mapping to the known vocabulary."],"tags":["validation","trace-rmi","memory-model"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}