{"record":{"id":"1c8f69f0585a107f","repo":"NationalSecurityAgency/ghidra","slug":"failed-to-resolve-data-length-for-origtype-getnam","errorCode":null,"errorMessage":"Failed to resolve data length for {origType.getName}","messagePattern":"Failed to resolve data length for (.+?)","errorType":"exception","errorClass":"CodeUnitInsertionException","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/listing/DBTraceDefinedDataView.java","lineNumber":124,"sourceCode":"\t\t\tdataType = dataType.clone(dtm);\n\n\t\t\tif (isFunctionDefinition(dataType)) {\n\t\t\t\tdataType = new PointerDataType(dataType, dtm);\n\t\t\t\tlength = dataType.getLength();\n\t\t\t}\n\t\t\telse if (dataType instanceof Dynamic) {\n\t\t\t\t// TODO: Should I consider no observations to be \"uninitialized\"?\n\t\t\t\t// If so, dynamic types cannot be applied here\n\t\t\t\tDynamic dyn = (Dynamic) dataType;\n\t\t\t\tMemBuffer buffer = memSpace.getBufferAt(startSnap, address);\n\t\t\t\tlength = dyn.getLength(buffer, length);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlength = dataType.getLength();\n\t\t\t}\n\n\t\t\tif (length < 0) {\n\t\t\t\tthrow new CodeUnitInsertionException(\n\t\t\t\t\t\"Failed to resolve data length for \" + origType.getName());\n\t\t\t}\n\t\t\tif (length == 0) {\n\t\t\t\tthrow new CodeUnitInsertionException(\n\t\t\t\t\t\"Zero-length data not allowed \" + origType.getName());\n\t\t\t}\n\n\t\t\tAddress endAddress = address.addNoWrap(length - 1);\n\t\t\tAddressRangeImpl createdRange = new AddressRangeImpl(address, endAddress);\n\n\t\t\t// Truncate, then check that against existing code units.\n\t\t\tlong endSnap = computeTruncatedMax(lifespan, null, createdRange);\n\t\t\tTraceAddressSnapRange tasr =\n\t\t\t\tnew ImmutableTraceAddressSnapRange(createdRange, Lifespan.span(startSnap, endSnap));\n\t\t\tif (!space.undefinedData.coversRange(tasr)) {\n\t\t\t\t// TODO: Figure out the conflicting unit?\n\t\t\t\tthrow new CodeUnitInsertionException(\"Code units cannot overlap\");\n\t\t\t}","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/listing/DBTraceDefinedDataView.java#L106-L142","documentation":"Thrown by DBTraceDefinedDataView.create() when the resolved data length is negative (< 0), meaning the data type could not determine a valid byte length from the available information. For fixed types this means getLength() returned -1; for Dynamic types, dyn.getLength(buffer, length) returned -1. A data unit requires a known positive length to define its address range, so a negative length prevents unit creation.","triggerScenarios":"Calling create() with a DataType whose getLength() returns -1 (unsized/variable type) and is not Dynamic (or is Dynamic but getLength returned -1). For Dynamic types, this happens when dyn.getLength(buffer, length) cannot compute a size from the memory buffer — e.g., insufficient or non-matching bytes.","commonSituations":"Applying a variable-length data type at uninitialized memory; Dynamic type (e.g., a string type) that cannot determine its length because the terminator or size field is absent; using a data type from a different architecture that expects different byte patterns.","solutions":["Provide an explicit positive origLength when the type is variable: use the create(lifespan, address, platform, dataType, length) overload with a concrete length.","Ensure memory bytes are written so Dynamic types can compute length: trace.getMemoryManager().putBytes().","Use a fixed-size DataType that has a known getLength()."],"exampleFix":"// before — variable-length type with no resolvable length\nview.create(lifespan, address, platform, dynamicType); // length < 0\n\n// after — pass explicit length or ensure bytes are present\nview.create(lifespan, address, platform, dynamicType, 16); // explicit length\n// OR write the expected bytes first:\ntrace.getMemoryManager().putBytes(snap, address, dataWithTerminator);","handlingStrategy":"validation","validationCode":"// Compute expected length before creating\nint expectedLength;\nif (dataType instanceof Dynamic dyn) {\n    MemBuffer buffer = memSpace.getBufferAt(startSnap, address);\n    expectedLength = dyn.getLength(buffer, dataType.getLength());\n} else {\n    expectedLength = dataType.getLength();\n}\nif (expectedLength < 0) {\n    // Provide explicit length using the overloaded create method\n    view.create(lifespan, address, platform, dataType, explicitLength);\n    return;\n}\nview.create(lifespan, address, platform, dataType);","typeGuard":null,"tryCatchPattern":"try {\n    view.create(lifespan, address, platform, dataType, length);\n} catch (CodeUnitInsertionException e) {\n    if (e.getMessage().startsWith(\"Failed to resolve data length\")) {\n        // Length unresolvable — pass explicit length or use a fixed type\n        view.create(lifespan, address, platform, ByteDataType.dataType, 1);\n    } else {\n        throw e;\n    }\n}","preventionTips":["Always pass an explicit length via the 5-argument create() overload for variable-length types.","Write memory bytes before applying Dynamic data types so length can be computed.","Check dataType.getLength() before creating — if -1, use the explicit-length overload."],"tags":["data-type","length","create","dynamic-type","trace-modeling"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}