mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
GP-1650: Introduce Reason for reading state. Fix spurrious uninit warnings.
This commit is contained in:
@@ -68,7 +68,7 @@ public abstract class AbstractTaintPcodeExecutorStatePiece<S extends TaintSpace>
|
||||
* Extension point: Create the actual space map
|
||||
*
|
||||
* <p>
|
||||
* This will need to be implemented by each state piece, i.e., non-abstract derivating class.
|
||||
* This will need to be implemented by each state piece, i.e., non-abstract derivative class.
|
||||
* The space map will provide instances of {@code <S>}, which will provide the actual (extended)
|
||||
* storage logic.
|
||||
*
|
||||
@@ -100,7 +100,7 @@ public abstract class AbstractTaintPcodeExecutorStatePiece<S extends TaintSpace>
|
||||
* the storage space.
|
||||
*/
|
||||
@Override
|
||||
protected void setInSpace(TaintSpace space, long offset, int size, TaintVec val) {
|
||||
protected void setInSpace(S space, long offset, int size, TaintVec val) {
|
||||
space.set(offset, val);
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ public abstract class AbstractTaintPcodeExecutorStatePiece<S extends TaintSpace>
|
||||
* the storage space.
|
||||
*/
|
||||
@Override
|
||||
protected TaintVec getFromSpace(TaintSpace space, long offset, int size) {
|
||||
protected TaintVec getFromSpace(S space, long offset, int size, Reason reason) {
|
||||
return space.get(offset, size);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ public class TaintPcodeThreadExecutor extends PcodeThreadExecutor<Pair<byte[], T
|
||||
*/
|
||||
@Override
|
||||
public void executeConditionalBranch(PcodeOp op, PcodeFrame frame) {
|
||||
Pair<byte[], TaintVec> condition = state.getVar(op.getInput(1));
|
||||
Pair<byte[], TaintVec> condition = state.getVar(op.getInput(1), reason);
|
||||
TaintVec taint = condition.getRight();
|
||||
if (!taint.union().isEmpty()) {
|
||||
// getInstruction may return null if an inject executes a CBRANCH
|
||||
|
||||
@@ -31,6 +31,7 @@ import ghidra.pcode.emu.sys.EmuProcessExitedException;
|
||||
import ghidra.pcode.emu.taint.lib.TaintEmuUnixFileSystem;
|
||||
import ghidra.pcode.emu.taint.lib.TaintFileReadsLinuxAmd64SyscallLibrary;
|
||||
import ghidra.pcode.exec.PcodeUseropLibrary;
|
||||
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
|
||||
import ghidra.pcode.utils.Utils;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.address.AddressSpace;
|
||||
@@ -146,7 +147,7 @@ public class TaintPcodeEmulatorTest extends AbstractGhidraHeadlessIntegrationTes
|
||||
thread.overrideContextWithDefault();
|
||||
thread.stepInstruction();
|
||||
|
||||
Pair<byte[], TaintVec> endRAX = thread.getState().getVar(regRAX);
|
||||
Pair<byte[], TaintVec> endRAX = thread.getState().getVar(regRAX, Reason.INSPECT);
|
||||
assertEquals(0,
|
||||
Utils.bytesToLong(endRAX.getLeft(), regRAX.getNumBytes(), language.isBigEndian()));
|
||||
assertEquals(TaintVec.empties(regRAX.getNumBytes()), endRAX.getRight());
|
||||
@@ -184,8 +185,8 @@ public class TaintPcodeEmulatorTest extends AbstractGhidraHeadlessIntegrationTes
|
||||
PcodeThread<?> thread = launchThread(start);
|
||||
execute(thread);
|
||||
|
||||
Pair<byte[], TaintVec> buf =
|
||||
emulator.getSharedState().getVar(space, 0x00400800, BYTES_HW.length, true);
|
||||
Pair<byte[], TaintVec> buf = emulator.getSharedState()
|
||||
.getVar(space, 0x00400800, BYTES_HW.length, true, Reason.INSPECT);
|
||||
assertArrayEquals(BYTES_HW, buf.getLeft());
|
||||
assertEquals(TaintVec.array("myfile", 0, BYTES_HW.length), buf.getRight());
|
||||
}
|
||||
@@ -197,7 +198,7 @@ public class TaintPcodeEmulatorTest extends AbstractGhidraHeadlessIntegrationTes
|
||||
thread.getExecutor().executeSleigh("*:8 0x00400000:8 = taint_arr(*:8 0x004000000:8);");
|
||||
|
||||
Pair<byte[], TaintVec> taintVal =
|
||||
emulator.getSharedState().getVar(space, 0x00400000, 8, true);
|
||||
emulator.getSharedState().getVar(space, 0x00400000, 8, true, Reason.INSPECT);
|
||||
assertArrayEquals(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, taintVal.getLeft());
|
||||
assertEquals(TaintVec.array("arr_0", 0, 8), taintVal.getRight());
|
||||
}
|
||||
@@ -227,7 +228,7 @@ public class TaintPcodeEmulatorTest extends AbstractGhidraHeadlessIntegrationTes
|
||||
thread.overrideContextWithDefault();
|
||||
thread.stepInstruction();
|
||||
|
||||
Pair<byte[], TaintVec> endRBX = thread.getState().getVar(regRBX);
|
||||
Pair<byte[], TaintVec> endRBX = thread.getState().getVar(regRBX, Reason.INSPECT);
|
||||
assertEquals(0x100f0e0d0c0b0a09L,
|
||||
Utils.bytesToLong(endRBX.getLeft(), regRBX.getNumBytes(), language.isBigEndian()));
|
||||
TaintSet fromIndirect = TaintVec.array("RAX", 0, 8).union().tagged("indR");
|
||||
@@ -262,7 +263,7 @@ public class TaintPcodeEmulatorTest extends AbstractGhidraHeadlessIntegrationTes
|
||||
thread.stepInstruction();
|
||||
|
||||
Pair<byte[], TaintVec> endMem =
|
||||
emulator.getSharedState().getVar(dyn, 0x0807060504030201L, 8, true);
|
||||
emulator.getSharedState().getVar(dyn, 0x0807060504030201L, 8, true, Reason.INSPECT);
|
||||
assertEquals(0x100f0e0d0c0b0a09L,
|
||||
Utils.bytesToLong(endMem.getLeft(), regRBX.getNumBytes(), language.isBigEndian()));
|
||||
TaintSet fromIndirect = TaintVec.array("RAX", 0, 8).union().tagged("indW");
|
||||
@@ -293,7 +294,7 @@ public class TaintPcodeEmulatorTest extends AbstractGhidraHeadlessIntegrationTes
|
||||
thread.overrideContextWithDefault();
|
||||
thread.stepInstruction();
|
||||
|
||||
Pair<byte[], TaintVec> endRAX = thread.getState().getVar(regRAX);
|
||||
Pair<byte[], TaintVec> endRAX = thread.getState().getVar(regRAX, Reason.INSPECT);
|
||||
assertEquals(0,
|
||||
Utils.bytesToLong(endRAX.getLeft(), regRAX.getNumBytes(), language.isBigEndian()));
|
||||
assertEquals(TaintVec.empties(regRAX.getNumBytes()), endRAX.getRight());
|
||||
|
||||
@@ -33,6 +33,7 @@ import ghidra.dbg.target.schema.SchemaContext;
|
||||
import ghidra.dbg.target.schema.XmlSchemaContext;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.SchemaName;
|
||||
import ghidra.pcode.emu.PcodeThread;
|
||||
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
|
||||
import ghidra.pcode.exec.trace.AbstractTracePcodeEmulatorTest;
|
||||
import ghidra.program.model.address.*;
|
||||
import ghidra.program.model.lang.Register;
|
||||
@@ -90,7 +91,7 @@ public class TaintTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest
|
||||
emuThread.getExecutor().executeSleigh("RAX = *0x00400000:8;");
|
||||
|
||||
Pair<byte[], TaintVec> valRAX =
|
||||
emuThread.getState().getVar(tb.language.getRegister("RAX"));
|
||||
emuThread.getState().getVar(tb.language.getRegister("RAX"), Reason.INSPECT);
|
||||
TaintVec exp = TaintVec.empties(8);
|
||||
TaintSet testTaint = TaintSet.of(new TaintMark("test_0", Set.of()));
|
||||
for (int i = 0; i < 4; i++) {
|
||||
@@ -120,7 +121,7 @@ public class TaintTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest
|
||||
emuThread.getExecutor().executeSleigh("RAX = RBX;");
|
||||
|
||||
Pair<byte[], TaintVec> valRAX =
|
||||
emuThread.getState().getVar(regRAX);
|
||||
emuThread.getState().getVar(regRAX, Reason.INSPECT);
|
||||
TaintVec exp = TaintVec.empties(8);
|
||||
TaintSet testTaint = TaintSet.of(new TaintMark("test_0", Set.of()));
|
||||
for (int i = 0; i < 4; i++) {
|
||||
|
||||
Reference in New Issue
Block a user