diff --git a/Ghidra/Debug/TaintAnalysis/src/main/java/ghidra/pcode/emu/taint/TaintPcodeArithmetic.java b/Ghidra/Debug/TaintAnalysis/src/main/java/ghidra/pcode/emu/taint/TaintPcodeArithmetic.java index 4c4da56cf5..dd033e5355 100644 --- a/Ghidra/Debug/TaintAnalysis/src/main/java/ghidra/pcode/emu/taint/TaintPcodeArithmetic.java +++ b/Ghidra/Debug/TaintAnalysis/src/main/java/ghidra/pcode/emu/taint/TaintPcodeArithmetic.java @@ -129,24 +129,28 @@ public enum TaintPcodeArithmetic implements PcodeArithmetic { */ @Override public TaintVec binaryOp(PcodeOp op, TaintVec in1, TaintVec in2) { + return PcodeArithmetic.super.binaryOp(op, in1, in2).withOp(op); + } + + @Override + public TaintVec binaryOp(int opcode, int sizeout, int sizein1, TaintVec in1, + int sizein2, TaintVec in2) { // TODO: Detect immediate operands and be more precise - switch (op.getOpcode()) { + switch (opcode) { case PcodeOp.INT_XOR, PcodeOp.INT_SUB, PcodeOp.BOOL_XOR -> { - if (Objects.equals(op.getInput(0), op.getInput(1))) { - return fromConst(0, op.getOutput().getSize()); // NB: withOp unneeded, as this essentially removes taint + if (Objects.equals(in1, in2)) { + return fromConst(0, sizeout); // NB: withOp unneeded, as this essentially removes taint } } } - int sizein2 = op.getInput(1).getSize(); - int sizeout = op.getOutput().getSize(); - return switch (op.getOpcode()) { + return switch (opcode) { case PcodeOp.BOOL_AND, PcodeOp.BOOL_OR, PcodeOp.BOOL_XOR, PcodeOp.INT_AND, // PcodeOp.INT_OR, PcodeOp.INT_XOR -> { - yield in1.zipUnion(in2).withOp(op); + yield in1.zipUnion(in2); } case PcodeOp.INT_ADD, PcodeOp.INT_SUB -> { TaintVec temp = in1.zipUnion(in2); - yield temp.setCascade(endian.isBigEndian()).withOp(op); + yield temp.setCascade(endian.isBigEndian()); } case PcodeOp.INT_SLESS, PcodeOp.INT_SLESSEQUAL, // PcodeOp.INT_LESS, PcodeOp.INT_LESSEQUAL, // @@ -154,26 +158,20 @@ public enum TaintPcodeArithmetic implements PcodeArithmetic { PcodeOp.FLOAT_LESS, PcodeOp.FLOAT_LESSEQUAL, // PcodeOp.FLOAT_EQUAL, PcodeOp.FLOAT_NOTEQUAL -> { TaintSet temp = in1.union().union(in2.union()); - yield TaintVec.copies(temp, sizeout).withOp(op); + yield TaintVec.copies(temp, sizeout); } case PcodeOp.PIECE -> { TaintVec temp = in1.extended(sizeout, endian.isBigEndian(), false); temp.setShifted(endian.isBigEndian() ? -sizein2 : sizein2, ShiftMode.UNBOUNDED); - yield temp.set(endian.isBigEndian() ? sizeout - sizein2 : 0, in2).withOp(op); + yield temp.set(endian.isBigEndian() ? sizeout - sizein2 : 0, in2); } default -> { TaintVec temp = in1.zipUnion(in2).truncated(sizeout, endian.isBigEndian()); - yield temp.setCopies(temp.union()).withOp(op); + yield temp.setCopies(temp.union()); } }; } - @Override - public TaintVec binaryOp(int opcode, int sizeout, int sizein1, TaintVec in1, - int sizein2, TaintVec in2) { - throw new RuntimeException("Not supported"); - } - /** * {@inheritDoc} * diff --git a/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/trace/TaintTracePcodeEmulatorTest.java b/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/trace/TaintTracePcodeEmulatorTest.java index be03b6773a..daf219f1c4 100644 --- a/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/trace/TaintTracePcodeEmulatorTest.java +++ b/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/trace/TaintTracePcodeEmulatorTest.java @@ -15,8 +15,7 @@ */ package ghidra.pcode.emu.taint.trace; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.Assert.*; import java.math.BigInteger; import java.nio.ByteBuffer; @@ -236,7 +235,7 @@ public class TaintTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest assertEquals(makeTaintEntries(tb.trace, Lifespan.at(1), ram, Set.of( 0x00600000L, 0x00600001L, 0x00600002L, 0x00600003L, 0x00600004L, 0x00600005L, 0x00600006L, 0x00600007L), - "test_0"), + "test_0@(ram, 0x400000, 0, 0)"), Set.copyOf(taintMap.getEntries( Lifespan.at(1), tb.range(0x00600000, 0x00600007)))); } @@ -366,7 +365,7 @@ public class TaintTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest assertEquals(makeTaintEntries(tb.trace, Lifespan.at(1), ram, Set.of( 0x20000000L, 0x20000001L, 0x20000002L, 0x20000003L, 0x20000004L, 0x20000005L, 0x20000006L, 0x20000007L), - "test_0"), + "test_0@(ram, 0x400000, 0, 0)"), Set.copyOf(taintMap.getEntries( Lifespan.at(1), tb.range(0x20000000, 0x20000007)))); }