use of org.sonar.java.bytecode.cfg.Instruction in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method test_dup.
@Test
public void test_dup() throws Exception {
SymbolicValue sv = new SymbolicValue();
ProgramState programState = execute(new Instruction(Opcodes.DUP), ProgramState.EMPTY_STATE.stackValue(sv));
ProgramState.Pop pop = programState.unstackValue(2);
assertThat(pop.values).containsOnly(sv);
assertThat(pop.state).isEqualTo(ProgramState.EMPTY_STATE);
assertThatThrownBy(() -> execute(new Instruction(Opcodes.DUP))).hasMessage("DUP on empty stack");
}
use of org.sonar.java.bytecode.cfg.Instruction in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method test_dup2_x1.
@Test
public void test_dup2_x1() throws Exception {
SymbolicValue sv1 = new SymbolicValue();
SymbolicValue sv2 = new SymbolicValue();
SymbolicValue sv3 = new SymbolicValue();
ProgramState programState = execute(new Instruction(Opcodes.DUP2_X1), ProgramState.EMPTY_STATE.stackValue(sv3).stackValue(sv2).stackValue(sv1));
ProgramState.Pop pop = programState.unstackValue(5);
assertThat(pop.values).containsExactly(sv1, sv2, sv3, sv1, sv2);
assertThat(pop.state).isEqualTo(ProgramState.EMPTY_STATE);
assertThatThrownBy(() -> execute(new Instruction(Opcodes.DUP2_X1), ProgramState.EMPTY_STATE.stackValue(sv1))).hasMessage("DUP2_X1 needs 3 values on stack");
}
use of org.sonar.java.bytecode.cfg.Instruction in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method test_putfield.
@Test
public void test_putfield() throws Exception {
SymbolicValue objectRef = new SymbolicValue();
SymbolicValue value = new SymbolicValue();
ProgramState programState = execute(new Instruction(Opcodes.PUTFIELD), ProgramState.EMPTY_STATE.stackValue(objectRef).stackValue(value));
assertThat(programState.peekValue()).isNull();
assertThatThrownBy(() -> execute(new Instruction(Opcodes.PUTFIELD), ProgramState.EMPTY_STATE.stackValue(value))).hasMessage("PUTFIELD needs 2 values on stack");
}
use of org.sonar.java.bytecode.cfg.Instruction in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method test_bipush.
@Test
public void test_bipush() throws Exception {
ProgramState programState = execute(new Instruction(Opcodes.BIPUSH, 42));
assertStack(programState, new Constraint[][] { { DivisionByZeroCheck.ZeroConstraint.NON_ZERO, ObjectConstraint.NOT_NULL } });
programState = execute(new Instruction(Opcodes.BIPUSH, 1));
assertStack(programState, new Constraint[][] { { DivisionByZeroCheck.ZeroConstraint.NON_ZERO, ObjectConstraint.NOT_NULL, BooleanConstraint.TRUE } });
programState = execute(new Instruction(Opcodes.BIPUSH, 0));
assertStack(programState, new Constraint[][] { { DivisionByZeroCheck.ZeroConstraint.ZERO, ObjectConstraint.NOT_NULL, BooleanConstraint.FALSE } });
}
use of org.sonar.java.bytecode.cfg.Instruction in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method test_iinc.
@Test
public void test_iinc() throws Exception {
SymbolicValue sv = new SymbolicValue();
ProgramState programState = ProgramState.EMPTY_STATE.put(2, sv);
programState = execute(new Instruction(Opcodes.IINC, 2), programState);
SymbolicValue result = programState.getValue(2);
assertThat(result).isNotEqualTo(sv);
assertThat(programState.getConstraint(result, ObjectConstraint.class)).isEqualTo(ObjectConstraint.NOT_NULL);
assertEmptyStack(programState);
assertThatThrownBy(() -> execute(new Instruction(Opcodes.IINC, 1), ProgramState.EMPTY_STATE)).hasMessage("Local variable 1 not found");
}
Aggregations