{"record":{"id":"f5d601ea638bd86f","repo":"NationalSecurityAgency/ghidra","slug":"address-space-name-already-exists","errorCode":null,"errorMessage":"Address space ${name} already exists.","messagePattern":"Address space (.+?) already exists\\.","errorType":"validation","errorClass":"DuplicateNameException","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/address/DBTraceOverlaySpaceAdapter.java","lineNumber":281,"sourceCode":"\n\t\tDBTraceOverlaySpaceEntry ent = overlayStore.create();\n\t\tProgramOverlayAddressSpace space = factory.addOverlaySpace(ent.getKey(), name, base);\n\n\t\t// Only if it succeeds do we store the record\n\t\tent.set(space.getName(), base.getName());\n\t\ttrace.updateViewsAddSpaceBlock(space);\n\t\ttrace.setChanged(\n\t\t\tnew TraceChangeRecord<>(TraceEvents.OVERLAY_ADDED, space, trace, null, space));\n\t\treturn space;\n\t}\n\n\tpublic AddressSpace createOverlayAddressSpace(String name, AddressSpace base)\n\t\t\tthrows DuplicateNameException {\n\t\t// TODO: Exclusive lock?\n\t\ttry (LockHold hold = LockHold.lock(lock.writeLock())) {\n\t\t\tTraceAddressFactory factory = trace.getInternalAddressFactory();\n\t\t\tif (factory.getAddressSpace(name) != null) {\n\t\t\t\tthrow new DuplicateNameException(\"Address space \" + name + \" already exists.\");\n\t\t\t}\n\t\t\treturn doCreateOverlaySpace(name, base);\n\t\t}\n\t}\n\n\tpublic AddressSpace getOrCreateOverlayAddressSpace(String name, AddressSpace base) {\n\t\t// TODO: Exclusive lock?\n\t\ttry (LockHold hold = LockHold.lock(lock.writeLock())) {\n\t\t\tTraceAddressFactory factory = trace.getInternalAddressFactory();\n\t\t\tAddressSpace space = factory.getAddressSpace(name);\n\t\t\tif (space != null) {\n\t\t\t\treturn space.getPhysicalSpace() == base ? space : null;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn doCreateOverlaySpace(name, base);\n\t\t\t}\n\t\t\tcatch (DuplicateNameException e) {\n\t\t\t\tthrow new AssertionError(e);","sourceCodeStart":263,"sourceCodeEnd":299,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/address/DBTraceOverlaySpaceAdapter.java#L263-L299","documentation":"createOverlayAddressSpace (the public entry point) checks factory.getAddressSpace(name) != null under the write lock and throws DuplicateNameException(\"Address space name already exists.\") if the name is taken. Same invariant as the inner doCreateOverlaySpace check, surfaced one level up. Any address-space name (overlay or base) colliding triggers it.","triggerScenarios":"Calling createOverlayAddressSpace(name, base) where name already names an address space in the factory; double creation without prior existence check.","commonSituations":"UI-driven overlay creation where the user reuses an existing name; scripts that assume a fresh trace; names colliding with built-in spaces.","solutions":["Prefer getOrCreateOverlayAddressSpace when you want idempotent behavior.","Check factory.getAddressSpace(name) == null before creating.","Catch DuplicateNameException at the call site and prompt for a new name."],"exampleFix":"// before\nAddressSpace s = trace.createOverlayAddressSpace(name, base);\n\n// after\nAddressSpace s;\nif (factory.getAddressSpace(name) != null) {\n    s = trace.getOrCreateOverlayAddressSpace(name, base);\n} else {\n    s = trace.createOverlayAddressSpace(name, base);\n}","handlingStrategy":"validation","validationCode":"if (factory.getAddressSpace(name) != null) {\n    return trace.getOrCreateOverlayAddressSpace(name, base);\n}","typeGuard":null,"tryCatchPattern":"try { return trace.createOverlayAddressSpace(name, base); }\ncatch (DuplicateNameException e) { return trace.getOrCreateOverlayAddressSpace(name, base); }","preventionTips":["Default to getOrCreate unless you specifically need create-or-fail semantics.","Surface duplicate-name errors to the UI as a rename prompt, not a crash.","Reserve built-in space names to avoid accidental collisions."],"tags":["overlay","duplicate-name","validation"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}