NationalSecurityAgency/ghidra · error · RuntimeException

Not supported

Error message

Not supported

What it means

TaintPcodeArithmetic is an auxiliary taint-tracking arithmetic layered on top of concrete bytes. The PcodeArithmetic interface has two forms of modBeforeStore: a PcodeOp-based default method and a size-based abstract one. TaintPcodeArithmetic implements only the PcodeOp form (which is what the framework calls) and throws RuntimeException on the size-based form because taint tracking needs the full op context - offset sizes alone aren't enough to tag an indirect write. The source comment notes an AssertionError would also be fitting.

Source

Thrown at Ghidra/Debug/TaintAnalysis/src/main/java/ghidra/pcode/emu/taint/TaintPcodeArithmetic.java:190

		};
	}

	/**
	 * {@inheritDoc}
	 * 
	 * <p>
	 * Here we handle indirect taint for indirect writes
	 */
	@Override
	public TaintVec modBeforeStore(PcodeOp op, AddressSpace space, TaintVec inOffset,
			TaintVec inValue) {
		return inValue.tagIndirectWrite(inOffset).withOp(op);
	}

	@Override
	public TaintVec modBeforeStore(int sizeinOffset, AddressSpace space, TaintVec inOffset,
			int sizeinValue, TaintVec inValue) {
		throw new RuntimeException("Not supported");
	}

	/**
	 * {@inheritDoc}
	 * 
	 * <p>
	 * Here we handle indirect taint for indirect reads
	 */
	@Override
	public TaintVec modAfterLoad(PcodeOp op, AddressSpace space, TaintVec inOffset,
			TaintVec inValue) {
		return inValue.tagIndirectRead(inOffset).withOp(op);
	}

	@Override
	public TaintVec modAfterLoad(int sizeinOffset, AddressSpace space, TaintVec inOffset,
			int sizeinValue, TaintVec inValue) {
		throw new RuntimeException("Not supported");

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Call the PcodeOp-based modBeforeStore overload instead, which is fully implemented for taint.
  2. Ensure the executor uses the op-based path (the default), so the size-based method is never hit.
  3. If you must support the size form, subclass and override it with a real taint implementation.

Example fix

// before
arithmetic.modBeforeStore(offSize, space, inOffset, valSize, inValue); // throws
// after
arithmetic.modBeforeStore(pcodeOp, space, inOffset, inValue);
Defensive patterns

Strategy: validation

Validate before calling

// Prefer the op-based overload; only call it when you have a PcodeOp:
if (op != None) {
    arithmetic.modBeforeStore(op, space, inOffset, inValue);
} else {
    throw new IllegalStateException("taint modBeforeStore requires a PcodeOp");
}

Prevention

When it happens

Trigger: Directly calling taintArithmetic.modBeforeStore(int sizeinOffset, AddressSpace, TaintVec inOffset, int sizeinValue, TaintVec inValue). The default framework path routes through the PcodeOp overload, so this is normally unreachable unless user code or a non-standard executor invokes the size-based API.

Common situations: User pcode-emulation scripts calling the size-based API directly; an executor wiring TaintPcodeArithmetic as a standalone arithmetic that bypasses the op overload; a newer framework version that calls the size-based method.

Related errors


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