use of org.sonar.java.se.symbolicvalues.SymbolicValue in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method test_instanceof.
@Test
public void test_instanceof() throws Exception {
SymbolicValue sv = new SymbolicValue();
ProgramState programState = execute(new Instruction(Opcodes.INSTANCEOF), ProgramState.EMPTY_STATE.stackValue(sv));
SymbolicValue result = programState.peekValue();
assertThat(result).isInstanceOf(SymbolicValue.InstanceOfSymbolicValue.class);
assertThat(result.computedFrom().get(0)).isEqualTo(sv);
assertThatThrownBy(() -> execute(new Instruction(Opcodes.INSTANCEOF))).hasMessage("INSTANCEOF needs 1 values on stack");
}
use of org.sonar.java.se.symbolicvalues.SymbolicValue in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method test_dup2_x2_form3.
@Test
public void test_dup2_x2_form3() throws Exception {
SymbolicValue sv1 = new SymbolicValue();
SymbolicValue sv2 = new SymbolicValue();
SymbolicValue sv3 = new SymbolicValue();
SymbolicValue sv4 = new SymbolicValue();
ProgramState startingState = ProgramState.EMPTY_STATE.stackValue(sv4).stackValue(sv3).stackValue(sv2).stackValue(sv1);
startingState = setDoubleOrLong(startingState, sv3, true);
ProgramState programState = execute(new Instruction(Opcodes.DUP2_X2), startingState);
ProgramState.Pop pop = programState.unstackValue(6);
assertThat(pop.values).containsExactly(sv1, sv2, sv3, sv1, sv2, sv4);
}
use of org.sonar.java.se.symbolicvalues.SymbolicValue in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method test_pop2_long_double.
@Test
public void test_pop2_long_double() throws Exception {
SymbolicValue normalSv = new SymbolicValue();
SymbolicValue longSv = new SymbolicValue();
ProgramState startingState = ProgramState.EMPTY_STATE.stackValue(normalSv).stackValue(longSv);
startingState = setDoubleOrLong(startingState, longSv, true);
ProgramState programState = execute(new Instruction(Opcodes.POP2), startingState);
assertThat(programState.peekValue()).isEqualTo(normalSv);
}
use of org.sonar.java.se.symbolicvalues.SymbolicValue in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method assertStack.
private void assertStack(ProgramState ps, Constraint[]... constraints) {
ProgramState.Pop pop = ps.unstackValue(constraints.length);
assertEmptyStack(pop.state);
assertThat(pop.valuesAndSymbols).hasSize(constraints.length);
List<SymbolicValue> symbolicValues = pop.values;
int idx = 0;
for (SymbolicValue sv : symbolicValues) {
ConstraintsByDomain constraintsByDomain = ps.getConstraints(sv);
if (constraintsByDomain != null) {
constraintsByDomain = constraintsByDomain.remove(BytecodeEGWalker.StackValueCategoryConstraint.class);
}
for (Constraint expectedConstraint : constraints[idx]) {
if (expectedConstraint != null) {
Class<? extends Constraint> expectedConstraintDomain = expectedConstraint.getClass();
Constraint constraint = constraintsByDomain.get(expectedConstraintDomain);
assertThat(constraint).isEqualTo(expectedConstraint);
constraintsByDomain = constraintsByDomain.remove(expectedConstraintDomain);
} else {
assertThat(constraintsByDomain).isNull();
}
}
if (constraintsByDomain != null) {
assertThat(constraintsByDomain.isEmpty()).isTrue();
}
idx++;
}
}
use of org.sonar.java.se.symbolicvalues.SymbolicValue in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method test_compare_with_zero.
@Test
public void test_compare_with_zero() {
SymbolicValue sv = new SymbolicValue();
int[] opcodes = { Opcodes.IFEQ, Opcodes.IFNE, Opcodes.IFLT, Opcodes.IFGE };
for (int opcode : opcodes) {
ProgramState programState = walker.branchingState(new Instruction(opcode), ProgramState.EMPTY_STATE.stackValue(sv));
RelationalSymbolicValue relSV = (RelationalSymbolicValue) programState.peekValue();
assertThat(relSV.getLeftOp()).isSameAs(sv);
assertThat(relSV.getRightOp()).isNotSameAs(sv);
assertThat(programState.getConstraints(relSV.getRightOp()).hasConstraint(DivisionByZeroCheck.ZeroConstraint.ZERO)).isTrue();
}
// these opcodes inverse operator and swap operands
int[] swapOperandsOpcodes = { Opcodes.IFLE, Opcodes.IFGT };
for (int opcode : swapOperandsOpcodes) {
ProgramState programState = walker.branchingState(new Instruction(opcode), ProgramState.EMPTY_STATE.stackValue(sv));
RelationalSymbolicValue relSV = (RelationalSymbolicValue) programState.peekValue();
assertThat(relSV.getRightOp()).isSameAs(sv);
assertThat(relSV.getLeftOp()).isNotSameAs(sv);
assertThat(programState.getConstraints(relSV.getLeftOp()).hasConstraint(DivisionByZeroCheck.ZeroConstraint.ZERO)).isTrue();
}
}
Aggregations