GP-1650: Introduce Reason for reading state. Fix spurrious uninit warnings.

This commit is contained in:
Dan
2022-09-22 14:47:08 -04:00
parent 45165ea167
commit dcd54c6695
44 changed files with 224 additions and 151 deletions

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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());

View File

@@ -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++) {