{"record":{"id":"70192862752f2767","repo":"NationalSecurityAgency/ghidra","slug":"error-parsing-register-value-string-part","errorCode":null,"errorMessage":"Error parsing register=value string {part}","messagePattern":"Error parsing register=value string (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"warning","filePath":"Ghidra/Extensions/MachineLearning/src/main/java/ghidra/machinelearning/functionfinding/FunctionStartRFParams.java","lineNumber":193,"sourceCode":"\t}\n\n\t/**\n\t * Parses register,value pairs if the form creg1=x,creg2=from csv and stores them.  Any \n\t * existing register,value pairs are discarded.\n\t * \n\t * @param csv the list to parse\n\t * @throws IllegalArgumentException if there are any parsing errors\n\t */\n\tpublic void setRegistersAndValues(String csv) {\n\t\tcontextRegisterNames = new ArrayList<>();\n\t\tcontextRegisterVals = new ArrayList<>();\n\t\tString[] parts = csv.split(\",\");\n\t\tfor (String part : parts) {\n\t\t\tString[] regValPair = part.split(\"=\");\n\t\t\tif (regValPair.length != 2) {\n\t\t\t\tcontextRegisterNames.clear();\n\t\t\t\tcontextRegisterVals.clear();\n\t\t\t\tthrow new IllegalArgumentException(\"Error parsing register=value string \" + part);\n\t\t\t}\n\t\t\tString regName = regValPair[0].trim();\n\t\t\tif (trainingSource.getRegister(regName) == null) {\n\t\t\t\tcontextRegisterNames.clear();\n\t\t\t\tcontextRegisterVals.clear();\n\t\t\t\tthrow new IllegalArgumentException(\n\t\t\t\t\t\"Register \" + regName + \" not found for program \" + trainingSource.getName());\n\t\t\t}\n\t\t\tcontextRegisterNames.add(regName);\n\t\t\tBigInteger bigInt = new BigInteger(regValPair[1].trim());\n\t\t\tcontextRegisterVals.add(bigInt);\n\t\t}\n\t}\n\n\t/**\n\t * Parses a CSV into a sorted list of distinct integer values (duplicates are ignored).  Returns\n\t * an empty list of a parse error is encountered.\n\t * @param csv csv string to parse","sourceCodeStart":175,"sourceCodeEnd":211,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Extensions/MachineLearning/src/main/java/ghidra/machinelearning/functionfinding/FunctionStartRFParams.java#L175-L211","documentation":"Thrown by FunctionStartRFParams.setRegistersAndValues(csv) when a comma-separated part does not split into exactly two segments on '='. The expected form is 'creg1=x,creg2=y'; a part with zero, or 2+, equals signs fails the regValPair.length != 2 check. Partial state is cleared before throwing.","triggerScenarios":"setRegistersAndValues(\"eax,ebx=1\") (missing '='), or \"a==b\" (extra '='), or a stray token like \",\" or whitespace-only segment; any malformed register=value CSV element.","commonSituations":"User typing context-register constraints in the Function Finder params dialog; a config string copy-pasted from a source that used a different separator (':' or space); trailing comma producing an empty segment.","solutions":["Format each element as <register>=<value>, e.g. 'cs=0x33,ds=0x2b'.","Split on ',' first, then verify each element contains exactly one '=' before calling setRegistersAndValues.","Strip stray commas/whitespace; ensure the value is a valid BigInteger literal (hex 0x.. or decimal)."],"exampleFix":"// before\nparams.setRegistersAndValues(\"cs:0x33, ds=0x2b\"); // ':' instead of '='\n\n// after\nparams.setRegistersAndValues(\"cs=0x33,ds=0x2b\");","handlingStrategy":"validation","validationCode":"public static boolean isValidRegValCsv(String csv) {\n    if (csv == null || csv.trim().isEmpty()) return true; // empty ok if optional\n    for (String part : csv.split(\",\")) {\n        String[] kv = part.split(\"=\", -1);\n        if (kv.length != 2 || kv[0].trim().isEmpty() || kv[1].trim().isEmpty())\n            return false;\n    }\n    return true;\n}","typeGuard":"null","tryCatchPattern":"try {\n    params.setRegistersAndValues(csv);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Error parsing register=value string\")) {\n        // re-prompt user with the correct <reg>=<val> format\n    } else throw e;\n}","preventionTips":["Document the exact 'reg=value,reg=value' format next to the input field.","Validate the CSV shape before passing it in.","Trim whitespace around each token to avoid empty-name pitfalls."],"tags":["machine-learning","validation","config-parsing","function-finder"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}