NationalSecurityAgency/ghidra · error · IllegalArgumentException
This expression can only be evaulated on traces with languag
Error message
This expression can only be evaulated on traces with language {} What it means
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.
Source
Thrown at Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceSleighUtils.java:144
return buildByteWithStateExecutor(trace.getPlatformManager().getHostPlatform(), snap,
thread, frame);
}
/**
* Evaluate a compiled p-code expression on the given trace
*
* @param expr the expression
* @param trace the trace
* @param snap the snap
* @param thread the thread, required if register space is used
* @param frame the frame, for when register space is used
* @return the value of the expression as a byte array
*/
public static byte[] evaluateBytes(PcodeExpression expr, Trace trace, long snap,
TraceThread thread, int frame) {
SleighLanguage language = expr.getLanguage();
if (trace.getBaseLanguage() != language) {
throw new IllegalArgumentException(
"This expression can only be evaulated on traces with language " + language);
}
PcodeExecutor<byte[]> executor = buildByteExecutor(trace, snap, thread, frame);
return expr.evaluate(executor);
}
/**
* Evaluate a compiled p-code expression on the given trace
*
* @param expr the expression
* @param trace the trace
* @param snap the snap
* @param thread the thread, required if register space is used
* @param frame the frame, for when register space is used
* @return the value of the expression as a big integer
*/
public static BigInteger evaluate(PcodeExpression expr, Trace trace, long snap,
TraceThread thread, int frame) {View on GitHub (pinned to d5f144c24d)
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.
Example fix
// before: expr compiled from a different program's language byte[] val = TraceSleighUtils.evaluateBytes(expr, trace, snap, thread, frame); // after: compile from the trace's own language SleighLanguage tlang = (SleighLanguage) trace.getBaseLanguage(); PcodeExpression expr = SleighProgramCompiler.compileExpression(tlang, exprText); byte[] val = TraceSleighUtils.evaluateBytes(expr, trace, snap, thread, frame);
Defensive patterns
Strategy: validation
Validate before calling
SleighLanguage exprLang = expr.getLanguage();
if (trace.getBaseLanguage() != exprLang) {
expr = SleighProgramCompiler.compileExpression(
(SleighLanguage) trace.getBaseLanguage(), /* original source */);
}
byte[] v = TraceSleighUtils.evaluateBytes(expr, trace, snap, thread, frame); Type guard
static boolean expressionMatchesTrace(PcodeExpression expr, Trace trace) {
return expr.getLanguage() == trace.getBaseLanguage();
} Try / catch
try {
return TraceSleighUtils.evaluateBytes(expr, trace, snap, thread, frame);
} catch (IllegalArgumentException e) {
if (e.getMessage().contains("language")) {
expr = SleighProgramCompiler.compileExpression(
(SleighLanguage) trace.getBaseLanguage(), src);
return TraceSleighUtils.evaluateBytes(expr, trace, snap, thread, frame);
}
throw e;
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Trace must use a sleigh-based language
- AddressSpace '{}' is not in this trace (language={})
- Current trace does not use Sleigh
- Sleigh language required
- Emulation requires a Sleigh language
AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14).
Data as JSON: /api/errors/a1942181d528a6d9.
Report an issue: GitHub.