Merge remote-tracking branch 'origin/GP-2931_dev747368_nuke_unsigneddatautils'

This commit is contained in:
Ryan Kurtz 2023-01-11 06:34:47 -05:00
commit 559ea64048
5 changed files with 18 additions and 579 deletions

View file

@ -15,12 +15,12 @@
*/ */
package ghidra.program.util; package ghidra.program.util;
import java.math.BigInteger;
import java.util.*; import java.util.*;
import java.math.BigInteger;
import org.apache.commons.collections4.map.LRUMap; import org.apache.commons.collections4.map.LRUMap;
import generic.util.UnsignedDataUtils;
import ghidra.app.cmd.disassemble.DisassembleCommand; import ghidra.app.cmd.disassemble.DisassembleCommand;
import ghidra.app.cmd.function.CallDepthChangeInfo; import ghidra.app.cmd.function.CallDepthChangeInfo;
import ghidra.pcode.opbehavior.*; import ghidra.pcode.opbehavior.*;
@ -1319,7 +1319,7 @@ public class SymbolicPropogator {
val2 = vContext.getValue(in[1], false, evaluator); val2 = vContext.getValue(in[1], false, evaluator);
lval1 = vContext.getConstant(val1, evaluator); lval1 = vContext.getConstant(val1, evaluator);
lval2 = vContext.getConstant(val2, evaluator); lval2 = vContext.getConstant(val2, evaluator);
lresult = UnsignedDataUtils.unsignedLessThan(lval1, lval2) ? 1 : 0; lresult = Long.compareUnsigned(lval1, lval2) < 0 ? 1 : 0;
result = vContext.createConstantVarnode(lresult, val1.getSize()); result = vContext.createConstantVarnode(lresult, val1.getSize());
vContext.putValue(out, result, mustClearAll); vContext.putValue(out, result, mustClearAll);
break; break;
@ -1340,7 +1340,7 @@ public class SymbolicPropogator {
val2 = vContext.getValue(in[1], false, evaluator); val2 = vContext.getValue(in[1], false, evaluator);
lval1 = vContext.getConstant(val1, evaluator); lval1 = vContext.getConstant(val1, evaluator);
lval2 = vContext.getConstant(val2, evaluator); lval2 = vContext.getConstant(val2, evaluator);
lresult = UnsignedDataUtils.unsignedLessThanOrEqual(lval1, lval2) ? 1 : 0; lresult = Long.compareUnsigned(lval1, lval2) <= 0 ? 1 : 0;
result = vContext.createConstantVarnode(lresult, val1.getSize()); result = vContext.createConstantVarnode(lresult, val1.getSize());
vContext.putValue(out, result, mustClearAll); vContext.putValue(out, result, mustClearAll);
break; break;
@ -1693,7 +1693,7 @@ public class SymbolicPropogator {
} }
private InjectPayload findPcodeInjection(Program prog, PcodeInjectLibrary snippetLibrary, long callOtherIndex) { private InjectPayload findPcodeInjection(Program prog, PcodeInjectLibrary snippetLibrary, long callOtherIndex) {
InjectPayload payload = (InjectPayload) injectPayloadCache.get(callOtherIndex); InjectPayload payload = injectPayloadCache.get(callOtherIndex);
// has a payload value for the pcode callother index // has a payload value for the pcode callother index
if (payload != null) { if (payload != null) {

View file

@ -1,275 +0,0 @@
/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ghidra.util;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import generic.util.UnsignedDataUtils;
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
public class UnsignedDataUtilsTest extends AbstractGhidraHeadedIntegrationTest {
@Test
public void testByteGreaterThan() {
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((byte) 0, (byte) 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((byte) 1, (byte) 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThan((byte) 0xff, (byte) 0xee));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((byte) 1, (byte) 0xbb));
assertTrue(UnsignedDataUtils.unsignedGreaterThan((byte) 0xbb, (byte) 1));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((byte) 0, (byte) 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThan((byte) 2, (byte) 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((byte) 0, (byte) 0xaa));
assertTrue(UnsignedDataUtils.unsignedGreaterThan((byte) 0xaa, (byte) 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((byte) 25, (byte) 25));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((byte) 0xee, (byte) 0xee));
}
@Test
public void testByteGreaterThanOrEqual() {
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((byte) 0, (byte) 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual((byte) 1, (byte) 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((byte) 0xff, (byte) 0xee));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual((byte) 1, (byte) 0xbb));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((byte) 0xbb, (byte) 1));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual((byte) 0, (byte) 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((byte) 2, (byte) 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual((byte) 0, (byte) 0xaa));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((byte) 0xaa, (byte) 0));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((byte) 25, (byte) 25));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((byte) 0xee, (byte) 0xee));
}
@Test
public void testByteLessThan() {
assertTrue(!UnsignedDataUtils.unsignedLessThan((byte) 0, (byte) 0));
assertTrue(UnsignedDataUtils.unsignedLessThan((byte) 1, (byte) 2));
assertTrue(!UnsignedDataUtils.unsignedLessThan((byte) 0xff, (byte) 0xee));
assertTrue(UnsignedDataUtils.unsignedLessThan((byte) 1, (byte) 0xbb));
assertTrue(!UnsignedDataUtils.unsignedLessThan((byte) 0xbb, (byte) 1));
assertTrue(UnsignedDataUtils.unsignedLessThan((byte) 0, (byte) 2));
assertTrue(!UnsignedDataUtils.unsignedLessThan((byte) 2, (byte) 0));
assertTrue(UnsignedDataUtils.unsignedLessThan((byte) 0, (byte) 0xaa));
assertTrue(!UnsignedDataUtils.unsignedLessThan((byte) 0xaa, (byte) 0));
assertTrue(!UnsignedDataUtils.unsignedLessThan((byte) 25, (byte) 25));
assertTrue(!UnsignedDataUtils.unsignedLessThan((byte) 0xee, (byte) 0xee));
}
@Test
public void testByteLessThanOrEqual() {
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((byte) 0, (byte) 0));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((byte) 1, (byte) 2));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual((byte) 0xff, (byte) 0xee));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((byte) 1, (byte) 0xbb));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual((byte) 0xbb, (byte) 1));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((byte) 0, (byte) 2));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual((byte) 2, (byte) 0));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((byte) 0, (byte) 0xaa));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual((byte) 0xaa, (byte) 0));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((byte) 25, (byte) 25));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((byte) 0xee, (byte) 0xee));
}
@Test
public void testShortGreaterThan() {
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((short) 0, (short) 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((short) 1, (short) 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThan((short) 0xffff, (short) 0xeeee));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((short) 1, (short) 0xbbbb));
assertTrue(UnsignedDataUtils.unsignedGreaterThan((short) 0xbbbb, (short) 1));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((short) 0, (short) 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThan((short) 2, (short) 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((short) 0, (short) 0xaaaa));
assertTrue(UnsignedDataUtils.unsignedGreaterThan((short) 0xaaaa, (short) 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((short) 25, (short) 25));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan((short) 0xeeee, (short) 0xeeee));
}
@Test
public void testShortGreaterThanOrEqual() {
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((short) 0, (short) 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual((short) 1, (short) 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((short) 0xffff, (short) 0xeeee));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual((short) 1, (short) 0xbbbb));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((short) 0xbbbb, (short) 1));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual((short) 0, (short) 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((short) 2, (short) 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual((short) 0, (short) 0xaaaa));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((short) 0xaaaa, (short) 0));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((short) 25, (short) 25));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual((short) 0xeeee, (short) 0xeeee));
}
@Test
public void testShortLessThan() {
assertTrue(!UnsignedDataUtils.unsignedLessThan((short) 0, (short) 0));
assertTrue(UnsignedDataUtils.unsignedLessThan((short) 1, (short) 2));
assertTrue(!UnsignedDataUtils.unsignedLessThan((short) 0xffff, (short) 0xeeee));
assertTrue(UnsignedDataUtils.unsignedLessThan((short) 1, (short) 0xbbbb));
assertTrue(!UnsignedDataUtils.unsignedLessThan((short) 0xbbbb, (short) 1));
assertTrue(UnsignedDataUtils.unsignedLessThan((short) 0, (short) 2));
assertTrue(!UnsignedDataUtils.unsignedLessThan((short) 2, (short) 0));
assertTrue(UnsignedDataUtils.unsignedLessThan((short) 0, (short) 0xaaaa));
assertTrue(!UnsignedDataUtils.unsignedLessThan((short) 0xaaaa, (short) 0));
assertTrue(!UnsignedDataUtils.unsignedLessThan((short) 25, (short) 25));
assertTrue(!UnsignedDataUtils.unsignedLessThan((short) 0xeeee, (short) 0xeeee));
}
@Test
public void testShortLessThanOrEqual() {
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((short) 0, (short) 0));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((short) 1, (short) 2));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual((short) 0xffff, (short) 0xeeee));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((short) 1, (short) 0xbbbb));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual((short) 0xbbbb, (short) 1));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((short) 0, (short) 2));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual((short) 2, (short) 0));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((short) 0, (short) 0xaaaa));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual((short) 0xaaaa, (short) 0));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((short) 25, (short) 25));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual((short) 0xeeee, (short) 0xeeee));
}
/*********************************/
@Test
public void testIntGreaterThan() {
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(0, 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(1, 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThan(0xffffffff, 0xeeeeeeee));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(1, 0xbbbbbbbb));
assertTrue(UnsignedDataUtils.unsignedGreaterThan(0xbbbbbbbb, 1));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(0, 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThan(2, 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(0, 0xaaaaaaaa));
assertTrue(UnsignedDataUtils.unsignedGreaterThan(0xaaaaaaaa, 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(25, 25));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(0xeeeeeeee, 0xeeeeeeee));
}
@Test
public void testIntGreaterThanOrEqual() {
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(0, 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual(1, 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(0xffffffff, 0xeeeeeeee));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual(1, 0xbbbbbbbb));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(0xbbbbbbbb, 1));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual(0, 2));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(2, 0));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual(0, 0xaaaaaaaa));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(0xaaaaaaaa, 0));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(25, 25));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(0xeeeeeeee, 0xeeeeeeee));
}
@Test
public void testIntLessThan() {
assertTrue(!UnsignedDataUtils.unsignedLessThan(0, 0));
assertTrue(UnsignedDataUtils.unsignedLessThan(1, 2));
assertTrue(!UnsignedDataUtils.unsignedLessThan(0xffffffff, 0xeeeeeeee));
assertTrue(UnsignedDataUtils.unsignedLessThan(1, 0xbbbbbbbb));
assertTrue(!UnsignedDataUtils.unsignedLessThan(0xbbbbbbbb, 1));
assertTrue(UnsignedDataUtils.unsignedLessThan(0, 2));
assertTrue(!UnsignedDataUtils.unsignedLessThan(2, 0));
assertTrue(UnsignedDataUtils.unsignedLessThan(0, 0xaaaaaaaa));
assertTrue(!UnsignedDataUtils.unsignedLessThan(0xaaaaaaaa, 0));
assertTrue(!UnsignedDataUtils.unsignedLessThan(25, 25));
assertTrue(!UnsignedDataUtils.unsignedLessThan(0xeeeeeeee, 0xeeeeeeee));
}
@Test
public void testIntLessThanOrEqual() {
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(0, 0));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(1, 2));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual(0xffffffff, 0xeeeeeeee));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(1, 0xbbbbbbbb));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual(0xbbbbbbbb, 1));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(0, 2));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual(2, 0));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(0, 0xaaaaaaaa));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual(0xaaaaaaaa, 0));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(25, 25));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(0xeeeeeeee, 0xeeeeeeee));
}
/*********************************/
@Test
public void testLongGreaterThan() {
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(0L, 0L));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(1L, 2L));
assertTrue(UnsignedDataUtils.unsignedGreaterThan(0xffffffffffffffffL, 0xeeeeeeeeeeeeeeeeL));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(1L, 0xbbbbbbbbbbbbbbbbL));
assertTrue(UnsignedDataUtils.unsignedGreaterThan(0xbbbbbbbbbbbbbbbbL, 1L));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(0L, 2L));
assertTrue(UnsignedDataUtils.unsignedGreaterThan(2L, 0L));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(0L, 0xaaaaaaaaaaaaaaaaL));
assertTrue(UnsignedDataUtils.unsignedGreaterThan(0xaaaaaaaaaaaaaaaaL, 0L));
assertTrue(!UnsignedDataUtils.unsignedGreaterThan(25L, 25L));
assertTrue(
!UnsignedDataUtils.unsignedGreaterThan(0xeeeeeeeeeeeeeeeeL, 0xeeeeeeeeeeeeeeeeL));
}
@Test
public void testLongGreaterThanOrEqual() {
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(0L, 0L));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual(1L, 2L));
assertTrue(
UnsignedDataUtils.unsignedGreaterThanOrEqual(0xffffffffffffffffL, 0xeeeeeeeeeeeeeeeeL));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual(1L, 0xbbbbbbbbbbbbbbbbL));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(0xbbbbbbbbbbbbbbbbL, 1L));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual(0L, 2L));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(2L, 0L));
assertTrue(!UnsignedDataUtils.unsignedGreaterThanOrEqual(0L, 0xaaaaaaaaaaaaaaaaL));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(0xaaaaaaaaaaaaaaaaL, 0L));
assertTrue(UnsignedDataUtils.unsignedGreaterThanOrEqual(25L, 25L));
assertTrue(
UnsignedDataUtils.unsignedGreaterThanOrEqual(0xeeeeeeeeeeeeeeeeL, 0xeeeeeeeeeeeeeeeeL));
}
@Test
public void testLongLessThan() {
assertTrue(!UnsignedDataUtils.unsignedLessThan(0L, 0L));
assertTrue(UnsignedDataUtils.unsignedLessThan(1L, 2L));
assertTrue(!UnsignedDataUtils.unsignedLessThan(0xffffffffffffffffL, 0xeeeeeeeeeeeeeeeeL));
assertTrue(UnsignedDataUtils.unsignedLessThan(1L, 0xbbbbbbbbbbbbbbbbL));
assertTrue(!UnsignedDataUtils.unsignedLessThan(0xbbbbbbbbbbbbbbbbL, 1L));
assertTrue(UnsignedDataUtils.unsignedLessThan(0L, 2L));
assertTrue(!UnsignedDataUtils.unsignedLessThan(2L, 0L));
assertTrue(UnsignedDataUtils.unsignedLessThan(0L, 0xaaaaaaaaaaaaaaaaL));
assertTrue(!UnsignedDataUtils.unsignedLessThan(0xaaaaaaaaaaaaaaaaL, 0L));
assertTrue(!UnsignedDataUtils.unsignedLessThan(25L, 25L));
assertTrue(!UnsignedDataUtils.unsignedLessThan(0xeeeeeeeeeeeeeeeeL, 0xeeeeeeeeeeeeeeeeL));
}
@Test
public void testLongLessThanOrEqual() {
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(0L, 0L));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(1L, 2L));
assertTrue(
!UnsignedDataUtils.unsignedLessThanOrEqual(0xffffffffffffffffL, 0xeeeeeeeeeeeeeeeeL));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(1L, 0xbbbbbbbbbbbbbbbbL));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual(0xbbbbbbbbbbbbbbbbL, 1L));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(0L, 2L));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual(2L, 0L));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(0L, 0xaaaaaaaaaaaaaaaaL));
assertTrue(!UnsignedDataUtils.unsignedLessThanOrEqual(0xaaaaaaaaaaaaaaaaL, 0L));
assertTrue(UnsignedDataUtils.unsignedLessThanOrEqual(25L, 25L));
assertTrue(
UnsignedDataUtils.unsignedLessThanOrEqual(0xeeeeeeeeeeeeeeeeL, 0xeeeeeeeeeeeeeeeeL));
}
}

View file

@ -18,7 +18,6 @@ package db;
import java.io.IOException; import java.io.IOException;
import db.buffers.DataBuffer; import db.buffers.DataBuffer;
import generic.util.UnsignedDataUtils;
import ghidra.util.BigEndianDataConverter; import ghidra.util.BigEndianDataConverter;
/** /**
@ -102,26 +101,22 @@ public class FixedField10 extends FixedField {
throw new UnsupportedOperationException("may only compare similar Field types"); throw new UnsupportedOperationException("may only compare similar Field types");
} }
FixedField10 f = (FixedField10) o; FixedField10 f = (FixedField10) o;
if (hi8 != f.hi8) { int result = Long.compareUnsigned(hi8, f.hi8);
return UnsignedDataUtils.unsignedLessThan(hi8, f.hi8) ? -1 : 1; if (result == 0) {
result = Short.compareUnsigned(lo2, f.lo2);
} }
if (lo2 != f.lo2) { return result;
return UnsignedDataUtils.unsignedLessThan(lo2, f.lo2) ? -1 : 1;
}
return 0;
} }
@Override @Override
int compareTo(DataBuffer buffer, int offset) { int compareTo(DataBuffer buffer, int offset) {
long otherHi8 = buffer.getLong(offset); long otherHi8 = buffer.getLong(offset);
if (hi8 != otherHi8) { int result = Long.compareUnsigned(hi8, otherHi8);
return UnsignedDataUtils.unsignedLessThan(hi8, otherHi8) ? -1 : 1; if (result == 0) {
}
short otherLo2 = buffer.getShort(offset + 8); short otherLo2 = buffer.getShort(offset + 8);
if (lo2 != otherLo2) { result = Short.compareUnsigned(lo2, otherLo2);
return UnsignedDataUtils.unsignedLessThan(lo2, otherLo2) ? -1 : 1;
} }
return 0; return result;
} }
@Override @Override

View file

@ -1,281 +0,0 @@
/* ###
* IP: GHIDRA
* REVIEWED: YES
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package generic.util;
import ghidra.util.Conv;
/**
* A class for performing unsigned comparisons
* of java primitives.
*
*
*/
public class UnsignedDataUtils {
private UnsignedDataUtils() {
}
/**
* Simple test for the Comp class.
* @param args not used
*/
public static void main(String [] args) {
System.out.println((byte)5<(byte)250);
System.out.println(unsignedLessThan((byte)5,(byte)250));
System.out.println(0x5<0x87654321);
System.out.println(unsignedLessThan(0x5,0x87654321));
}
private final static int LESS_THAN = 0;
private final static int LESS_THAN_OR_EQUAL = 1;
private final static int GREATER_THAN = 2;
private final static int GREATER_THAN_OR_EQUAL = 3;
private static boolean comp(int type, byte i, byte j) {
return comp(type,
Conv.byteToLong(i),
Conv.byteToLong(j));
}
private static boolean comp(int type, short i, short j) {
return comp(type,
Conv.shortToLong(i),
Conv.shortToLong(j));
}
private static boolean comp(int type, int i, int j) {
return comp(type,
Conv.intToLong(i),
Conv.intToLong(j));
}
private static boolean comp(int type, long i, long j) {
boolean isHiBitSetI = i < 0;
boolean isHiBitSetJ = j < 0;
if (isHiBitSetI == isHiBitSetJ) {//same sign...
switch (type) {
case LESS_THAN:
return (i < j);
case LESS_THAN_OR_EQUAL:
return (i <= j);
case GREATER_THAN:
return (i > j);
case GREATER_THAN_OR_EQUAL:
return (i >= j);
}
}
else if (isHiBitSetI) {
switch (type) {
case LESS_THAN:
case LESS_THAN_OR_EQUAL:
return false;
case GREATER_THAN:
case GREATER_THAN_OR_EQUAL:
return true;
}
}
else {
switch (type) {
case LESS_THAN:
case LESS_THAN_OR_EQUAL:
return true;
case GREATER_THAN:
case GREATER_THAN_OR_EQUAL:
return false;
}
}
throw new RuntimeException("BAD COMP TYPE!");
}
/**
* Returns true if <code>i</code> is LESS THAN <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is less than <code>j</code>
*/
public static boolean unsignedLessThan(byte i, byte j) {
return comp(LESS_THAN, i, j);
}
/**
* Returns true if <code>i</code> is LESS THAN or EQUAL TO <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is less than or equal to <code>j</code>
*/
public static boolean unsignedLessThanOrEqual(byte i, byte j) {
return comp(LESS_THAN_OR_EQUAL, i, j);
}
/**
* Returns true if <code>i</code> is GREATER THAN <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is greater than <code>j</code>
*/
public static boolean unsignedGreaterThan(byte i, byte j) {
return comp(GREATER_THAN, i, j);
}
/**
* Returns true if <code>i</code> is GREATER THAN or EQUAL TO <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is greater than or equal to <code>j</code>
*/
public static boolean unsignedGreaterThanOrEqual(byte i, byte j) {
return comp(GREATER_THAN_OR_EQUAL, i, j);
}
/**
* Returns true if <code>i</code> is LESS THAN <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is less than <code>j</code>
*/
public static boolean unsignedLessThan(short i, short j) {
return comp(LESS_THAN, i, j);
}
/**
* Returns true if <code>i</code> is LESS THAN or EQUAL TO <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is less than or equal to <code>j</code>
*/
public static boolean unsignedLessThanOrEqual(short i, short j) {
return comp(LESS_THAN_OR_EQUAL, i, j);
}
/**
* Returns true if <code>i</code> is GREATER THAN <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is greater than <code>j</code>
*/
public static boolean unsignedGreaterThan(short i, short j) {
return comp(GREATER_THAN, i, j);
}
/**
* Returns true if <code>i</code> is GREATER THAN or EQUAL TO <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is greater than or equal to <code>j</code>
*/
public static boolean unsignedGreaterThanOrEqual(short i, short j) {
return comp(GREATER_THAN_OR_EQUAL, i, j);
}
/**
* Returns true if <code>i</code> is LESS THAN <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is less than <code>j</code>
*/
public static boolean unsignedLessThan(int i, int j) {
return comp(LESS_THAN, i, j);
}
/**
* Returns true if <code>i</code> is LESS THAN or EQUAL TO <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is less than or equal to <code>j</code>
*/
public static boolean unsignedLessThanOrEqual(int i, int j) {
return comp(LESS_THAN_OR_EQUAL, i, j);
}
/**
* Returns true if <code>i</code> is GREATER THAN <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is greater than <code>j</code>
*/
public static boolean unsignedGreaterThan(int i, int j) {
return comp(GREATER_THAN, i, j);
}
/**
* Returns true if <code>i</code> is GREATER THAN or EQUAL TO <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is greater than or equal to <code>j</code>
*/
public static boolean unsignedGreaterThanOrEqual(int i, int j) {
return comp(GREATER_THAN_OR_EQUAL, i, j);
}
/**
* Returns true if <code>i</code> is LESS THAN <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is less than <code>j</code>
*/
public static boolean unsignedLessThan(long i, long j) {
return comp(LESS_THAN, i, j);
}
/**
* Returns true if <code>i</code> is LESS THAN or EQUAL TO <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return true if <code>i</code> is less than or equal to <code>j</code>
*/
public static boolean unsignedLessThanOrEqual(long i, long j) {
return comp(LESS_THAN_OR_EQUAL, i, j);
}
/**
* Returns true if <code>i</code> is GREATER THAN <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return return true if <code>i</code> is greater than <code>j</code>
*/
public static boolean unsignedGreaterThan(long i, long j) {
return comp(GREATER_THAN, i, j);
}
/**
* Returns true if <code>i</code> is GREATER THAN or EQUAL TO <code>j</code>.
*
* @param i an argument
* @param j another argument
*
* @return return true if <code>i</code> is greater than or equal to <code>j</code>
*/
public static boolean unsignedGreaterThanOrEqual(long i, long j) {
return comp(GREATER_THAN_OR_EQUAL, i, j);
}
}

View file

@ -15,12 +15,12 @@
*/ */
package ghidra.pcodeCPort.slghsymbol; package ghidra.pcodeCPort.slghsymbol;
import java.io.PrintStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.io.PrintStream;
import org.jdom.Element; import org.jdom.Element;
import generic.util.UnsignedDataUtils;
// A global varnode // A global varnode
import ghidra.pcodeCPort.context.SleighError; import ghidra.pcodeCPort.context.SleighError;
import ghidra.pcodeCPort.pcoderaw.VarnodeData; import ghidra.pcodeCPort.pcoderaw.VarnodeData;
@ -71,9 +71,9 @@ public class VarnodeSymbol extends PatternlessSymbol {
int addrSize = base.getAddrSize(); int addrSize = base.getAddrSize();
long maxByteOffset = ((long) base.getWordSize() << (8 * addrSize)) - 1; long maxByteOffset = ((long) base.getWordSize() << (8 * addrSize)) - 1;
long endOffset = offset + size - 1; long endOffset = offset + size - 1;
boolean sizeError = size != 0 && UnsignedDataUtils.unsignedGreaterThan(offset, endOffset); boolean sizeError = size != 0 && Long.compareUnsigned(offset, endOffset) > 0;
if (!sizeError && addrSize < 8) { if (!sizeError && addrSize < 8) {
sizeError = UnsignedDataUtils.unsignedGreaterThan(endOffset, maxByteOffset); sizeError = Long.compareUnsigned(endOffset, maxByteOffset) > 0;
} }
if (sizeError) { if (sizeError) {
throw new SleighError(nm + ":" + size + " @ " + base.getName() + ":" + throw new SleighError(nm + ":" + size + " @ " + base.getName() + ":" +