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

  1. Compile the expression from the trace's own base language: SleighProgramCompiler.compileExpression((SleighLanguage) trace.getBaseLanguage(), exprString).
  2. Compare expr.getLanguage() to trace.getBaseLanguage() before evaluating; recompile if they differ.
  3. 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

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


AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14). Data as JSON: /api/errors/a1942181d528a6d9. Report an issue: GitHub.