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
- Call the PcodeOp-based modBeforeStore overload instead, which is fully implemented for taint.
- Ensure the executor uses the op-based path (the default), so the size-based method is never hit.
- 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
- Always call the PcodeOp-based modBeforeStore for taint.
- Run taint via the standard executor so the size-based method is never reached.
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
- Cannot make taint concrete
- Cannot make Taint concrete
- TaintVecs must match in length
- Timed out reading or writing target
- Error reading or writing target
AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14).
Data as JSON: /api/errors/67793b8a2414bfe5.
Report an issue: GitHub.