/*
* VariableValuationTest.java - This file is part of the Jakstab project.
* Copyright 2007-2015 Johannes Kinder <jk@jakstab.org>
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, see <http://www.gnu.org/licenses/>.
*/
package org.jakstab.analysis;
import static org.junit.Assert.*;
import org.jakstab.analysis.explicit.*;
import org.jakstab.rtl.expressions.ExpressionFactory;
import org.jakstab.rtl.expressions.RTLVariable;
import org.jakstab.util.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class VariableValuationTest {
@SuppressWarnings("unused")
private static final Logger logger = Logger
.getLogger(VariableValuationTest.class);
private static RTLVariable x32;
private static RTLVariable y16;
private static RTLVariable z32;
private static NumberElement n32;
private static NumberElement n32b;
private static NumberElement n32c;
private static NumberElement n16;
private static RTLVariable eax;
private static RTLVariable ax;
private static RTLVariable ah;
private static RTLVariable al;
@Before
public void setUp() throws Exception {
x32 = ExpressionFactory.createVariable("x32", 32);
y16 = ExpressionFactory.createVariable("y16", 16);
z32 = ExpressionFactory.createVariable("z32", 32);
n32 = new NumberElement(ExpressionFactory.createNumber(52, 32));
n32b = new NumberElement(ExpressionFactory.createNumber(13, 32));
n32c = new NumberElement(ExpressionFactory.createNumber(13, 32));
n16 = new NumberElement(ExpressionFactory.createNumber(-123, 16));
eax = ExpressionFactory.createVariable("eax", 32);
ax = ExpressionFactory.createSharedRegisterVariable("ax", "eax", 0, 15);
ah = ExpressionFactory.createSharedRegisterVariable("ah", "ax", 8, 15);
al = ExpressionFactory.createSharedRegisterVariable("al", "ax", 0, 7);
}
@After
public void tearDown() throws Exception {
}
@Test
public void testSet() {
VariableValuation<NumberElement> aVarVal =
new VariableValuation<NumberElement>(new NumberElementFactory());
aVarVal.set(x32, n32);
aVarVal.set(y16, n16);
assertEquals(n16, aVarVal.get(y16));
assertEquals(n32, aVarVal.get(x32));
}
@Test
public void testRegisterMasking() {
VariableValuation<BasedNumberElement> aVarVal =
new VariableValuation<BasedNumberElement>(new BasedNumberElementFactory());
BasedNumberElement val1 = new BasedNumberElement(ExpressionFactory.createNumber(0xCAFE3344, 32));
BasedNumberElement val2 = new BasedNumberElement(ExpressionFactory.createNumber(0xBE, 8));
BasedNumberElement val3 = new BasedNumberElement(ExpressionFactory.createNumber(0xBA, 8));
aVarVal.set(eax, val1);
assertEquals(val1, aVarVal.get(eax));
aVarVal.set(al, val2);
assertEquals(new BasedNumberElement(ExpressionFactory.createNumber(0xCAFE33BE, 32)), aVarVal.get(eax));
aVarVal.set(ah, val3);
assertEquals(new BasedNumberElement(ExpressionFactory.createNumber(0xCAFEBABE, 32)), aVarVal.get(eax));
assertEquals(new BasedNumberElement(ExpressionFactory.createNumber(0xBABE, 16)), aVarVal.get(ax));
}
@Test
public void testIsTop() {
VariableValuation<NumberElement> aVarVal =
new VariableValuation<NumberElement>(new NumberElementFactory());
assertTrue(aVarVal.isTop());
aVarVal.set(x32, n32);
assertFalse(aVarVal.isTop());
aVarVal.set(x32, NumberElement.getTop(32));
assertTrue(aVarVal.isTop());
}
@Test
public void testJoin() {
VariableValuation<NumberElement> aVarVal1 =
new VariableValuation<NumberElement>(new NumberElementFactory());
VariableValuation<NumberElement> aVarVal2 =
new VariableValuation<NumberElement>(new NumberElementFactory());
aVarVal1.set(x32, n32);
aVarVal1.set(y16, n16);
aVarVal1.set(z32, n32b);
aVarVal2.set(x32, n32b);
aVarVal2.set(z32, n32c);
VariableValuation<NumberElement> join = aVarVal1.join(aVarVal2);
assertEquals(join, aVarVal2.join(aVarVal1));
assertTrue(aVarVal1.lessOrEqual(join));
assertTrue(aVarVal2.lessOrEqual(join));
assertEquals(NumberElement.getTop(32), join.get(x32));
assertEquals(NumberElement.getTop(16), join.get(y16));
assertEquals(n32b, join.get(z32));
assertEquals(n32c, join.get(z32));
}
@Test
public void testLessOrEqual() {
VariableValuation<NumberElement> aVarVal1 =
new VariableValuation<NumberElement>(new NumberElementFactory());
VariableValuation<NumberElement> aVarVal2 =
new VariableValuation<NumberElement>(new NumberElementFactory());
aVarVal1.set(x32, n32);
aVarVal1.set(y16, n16);
aVarVal1.set(z32, n32b);
assertTrue(aVarVal1.lessOrEqual(aVarVal2));
aVarVal2.set(z32, n32c);
assertTrue(aVarVal1.lessOrEqual(aVarVal2));
aVarVal2.set(z32, n32);
assertFalse(aVarVal1.lessOrEqual(aVarVal2));
}
@Test
public void testEqualsObject() {
VariableValuation<NumberElement> aVarVal1 =
new VariableValuation<NumberElement>(new NumberElementFactory());
VariableValuation<NumberElement> aVarVal2 =
new VariableValuation<NumberElement>(new NumberElementFactory());
assertEquals(aVarVal1, aVarVal2);
aVarVal1.set(x32, n32b);
assertFalse(aVarVal1.equals(aVarVal2));
aVarVal2.set(x32, n32c);
assertEquals(aVarVal1, aVarVal2);
}
}