{"record":{"id":"a1942181d528a6d9","repo":"NationalSecurityAgency/ghidra","slug":"this-expression-can-only-be-evaulated-on-traces-wi","errorCode":null,"errorMessage":"This expression can only be evaulated on traces with language {}","messagePattern":"This expression can only be evaulated on traces with language (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceSleighUtils.java","lineNumber":144,"sourceCode":"\t\treturn buildByteWithStateExecutor(trace.getPlatformManager().getHostPlatform(), snap,\n\t\t\tthread, frame);\n\t}\n\n\t/**\n\t * Evaluate a compiled p-code expression on the given trace\n\t * \n\t * @param expr the expression\n\t * @param trace the trace\n\t * @param snap the snap\n\t * @param thread the thread, required if register space is used\n\t * @param frame the frame, for when register space is used\n\t * @return the value of the expression as a byte array\n\t */\n\tpublic static byte[] evaluateBytes(PcodeExpression expr, Trace trace, long snap,\n\t\t\tTraceThread thread, int frame) {\n\t\tSleighLanguage language = expr.getLanguage();\n\t\tif (trace.getBaseLanguage() != language) {\n\t\t\tthrow new IllegalArgumentException(\n\t\t\t\t\"This expression can only be evaulated on traces with language \" + language);\n\t\t}\n\t\tPcodeExecutor<byte[]> executor = buildByteExecutor(trace, snap, thread, frame);\n\t\treturn expr.evaluate(executor);\n\t}\n\n\t/**\n\t * Evaluate a compiled p-code expression on the given trace\n\t * \n\t * @param expr the expression\n\t * @param trace the trace\n\t * @param snap the snap\n\t * @param thread the thread, required if register space is used\n\t * @param frame the frame, for when register space is used\n\t * @return the value of the expression as a big integer\n\t */\n\tpublic static BigInteger evaluate(PcodeExpression expr, Trace trace, long snap,\n\t\t\tTraceThread thread, int frame) {","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceSleighUtils.java#L126-L162","documentation":"evaluateBytes(PcodeExpression, ...) runs a pre-compiled p-code expression against a trace. The expression carries the language it was compiled for (expr.getLanguage()); that must equal trace.getBaseLanguage(), otherwise the executor would interpret registers/addresses under the wrong address factory and language model.","triggerScenarios":"Compiling a PcodeExpression with one SleighLanguage (e.g. via SleighProgramCompiler on program A) and evaluating it on a trace whose base language is a different SleighLanguage. Reusing a cached expression across programs/traces with differing language versions.","commonSituations":"Expression compiled from a loaded Program, then applied to a Trace recorded under a different (or version-mismatched) language. Sharing expressions between traces of distinct architectures.","solutions":["Compile the expression from the trace's own base language: SleighProgramCompiler.compileExpression((SleighLanguage) trace.getBaseLanguage(), exprString).","Compare expr.getLanguage() to trace.getBaseLanguage() before evaluating; recompile if they differ.","Avoid caching expressions keyed only by source text; key by language identity/version too."],"exampleFix":"// before: expr compiled from a different program's language\nbyte[] val = TraceSleighUtils.evaluateBytes(expr, trace, snap, thread, frame);\n\n// after: compile from the trace's own language\nSleighLanguage tlang = (SleighLanguage) trace.getBaseLanguage();\nPcodeExpression expr = SleighProgramCompiler.compileExpression(tlang, exprText);\nbyte[] val = TraceSleighUtils.evaluateBytes(expr, trace, snap, thread, frame);","handlingStrategy":"validation","validationCode":"SleighLanguage exprLang = expr.getLanguage();\nif (trace.getBaseLanguage() != exprLang) {\n    expr = SleighProgramCompiler.compileExpression(\n        (SleighLanguage) trace.getBaseLanguage(), /* original source */);\n}\nbyte[] v = TraceSleighUtils.evaluateBytes(expr, trace, snap, thread, frame);","typeGuard":"static boolean expressionMatchesTrace(PcodeExpression expr, Trace trace) {\n    return expr.getLanguage() == trace.getBaseLanguage();\n}","tryCatchPattern":"try {\n    return TraceSleighUtils.evaluateBytes(expr, trace, snap, thread, frame);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"language\")) {\n        expr = SleighProgramCompiler.compileExpression(\n            (SleighLanguage) trace.getBaseLanguage(), src);\n        return TraceSleighUtils.evaluateBytes(expr, trace, snap, thread, frame);\n    }\n    throw e;\n}","preventionTips":["Key any expression cache by language identity, not just source text.","Compile expressions from the trace's own base language when possible.","Treat PcodeExpression as language-scoped; do not share across architectures."],"tags":["sleigh","pcode-expression","language-mismatch","trace"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}