{"record":{"id":"a0b9d48f13185654","repo":"NationalSecurityAgency/ghidra","slug":"not-a-sleigh-language","errorCode":null,"errorMessage":"Not a Sleigh Language: ","messagePattern":"Not a Sleigh Language: ","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"warning","filePath":"Ghidra/Extensions/SleighDevTools/src/main/java/ghidra/app/util/disassemble/GNUExternalDisassembler.java","lineNumber":199,"sourceCode":"\t\t\t\t\tparseGdisOptionsFile(gDisOptionsFile.get(0));\n\t\t\t\t}\n\t\t\t\tcatch (IOException e) {\n\t\t\t\t\tMsg.error(this, \"Error reading gdis options file \" + e.getMessage());\n\t\t\t\t\tcontextRegister = null;\n\t\t\t\t\tvalueToOptionString = null;\n\t\t\t\t\tvalueToDisplayPrefix = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tGdisConfig(Language lang) {\n\t\t\tthis(lang, lang.isBigEndian());\n\t\t}\n\n\t\tprivate void parseGdisOptionsFile(String fileName) throws IOException {\n\t\t\tLanguageDescription desc = lang.getLanguageDescription();\n\t\t\tif (!(desc instanceof SleighLanguageDescription)) {\n\t\t\t\tthrow new IOException(\"Not a Sleigh Language: \" + lang.getLanguageID());\n\t\t\t}\n\n\t\t\tSleighLanguageDescription sld = (SleighLanguageDescription) desc;\n\t\t\tResourceFile defsFile = sld.getDefsFile();\n\t\t\tResourceFile parentFile = defsFile.getParentFile();\n\t\t\tResourceFile gdisOpts = new ResourceFile(parentFile, fileName);\n\t\t\tSAXBuilder sax = XmlUtilities.createSecureSAXBuilder(false, false);\n\t\t\ttry (InputStream fis = gdisOpts.getInputStream()) {\n\t\t\t\tDocument doc = sax.build(fis);\n\t\t\t\tElement rootElem = doc.getRootElement();\n\t\t\t\tElement globalElement = rootElem.getChild(\"global\");\n\t\t\t\tif (globalElement != null) {\n\t\t\t\t\tglobalDisassemblerOptions = globalElement.getAttributeValue(\"optstring\");\n\t\t\t\t}\n\t\t\t\tElement contextRegisterElement = rootElem.getChild(\"context_register\");\n\t\t\t\tif (contextRegisterElement == null) {\n\t\t\t\t\t//no context_register element found in the xml file \n\t\t\t\t\t//this is not necessarily an error - might only be a global optstring","sourceCodeStart":181,"sourceCodeEnd":217,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Extensions/SleighDevTools/src/main/java/ghidra/app/util/disassemble/GNUExternalDisassembler.java#L181-L217","documentation":"Thrown by GNUExternalDisassembler.GdisConfig.parseGdisOptionsFile() when the language's LanguageDescription is not a SleighLanguageDescription. The external GNU disassembler integration relies on Sleigh-specific data (the .defs file location via SleighLanguageDescription.getDefsFile()), so non-Sleigh languages cannot use this path. An IOException is thrown (and is caught/logged by the constructor, resetting config fields).","triggerScenarios":"Attempting to use the GNU external disassembler with a program whose language is not Sleigh-based (e.g. an old built-in language, or a language registered with a plain LanguageDescription); GdisConfig constructed for such a language triggers parseGdisOptionsFile which fails the instanceof check.","commonSituations":"Pointing the external disassembler at a legacy/programmatic language that wasn't defined via a .slaspec; mixed installations where some languages are Sleigh and others are not.","solutions":["Use a Sleigh-based language for the program (the normal case for Ghidra targets); re-import with a Sleigh language ID.","If the language should be Sleigh, ensure its LanguageDescription is a SleighLanguageDescription (defined via .slaspec/.ldefs).","Avoid the GNU external disassembler for non-Sleigh languages; use the built-in Sleigh disassembly."],"exampleFix":"null","handlingStrategy":"type-guard","validationCode":"import ghidra.program.model.lang.LanguageDescription;\nimport ghidra.app.plugin.processors.sleigh.SleighLanguageDescription;\nLanguageDescription desc = lang.getLanguageDescription();\nif (!(desc instanceof SleighLanguageDescription)) {\n    // cannot use GNU external disassembler; skip or re-import with a Sleigh language\n}","typeGuard":"public boolean isSleighLanguage(Language lang) {\n    return lang.getLanguageDescription() instanceof SleighLanguageDescription;\n}","tryCatchPattern":"try {\n    // external disassembler use\n} catch (IOException e) {\n    if (e.getMessage().startsWith(\"Not a Sleigh Language\")) {\n        // fall back to built-in Sleigh disassembly for this language\n    } else throw e;\n}","preventionTips":["Prefer Sleigh languages when importing programs that need external disassembly.","Guard with the instanceof check before constructing the external disassembler config.","Keep legacy non-Sleigh languages out of the external-disassembler code path."],"tags":["sleigh-devtools","external-disassembler","language","configuration"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}