mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
Merge remote-tracking branch 'origin/GP-2931_dev747368_nuke_unsigneddatautils'
This commit is contained in:
commit
559ea64048
5 changed files with 18 additions and 579 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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);
|
||||||
|
result = Short.compareUnsigned(lo2, otherLo2);
|
||||||
}
|
}
|
||||||
short otherLo2 = buffer.getShort(offset + 8);
|
return result;
|
||||||
if (lo2 != otherLo2) {
|
|
||||||
return UnsignedDataUtils.unsignedLessThan(lo2, otherLo2) ? -1 : 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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() + ":" +
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue