use of org.sonar.java.se.symbolicvalues.SymbolicValue 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.se.symbolicvalues.SymbolicValue 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");
}
use of org.sonar.java.se.symbolicvalues.SymbolicValue in project sonar-java by SonarSource.
the class BytecodeSECheckTest method zeroness_check_mul.
@Test
public void zeroness_check_mul() {
int[] opCodes = { Opcodes.DMUL, Opcodes.FMUL, Opcodes.IMUL, Opcodes.LMUL };
for (int mulOpCode : opCodes) {
Instruction instruction = new Instruction(mulOpCode);
ProgramState ps = execute(instruction, zeroZeroPs);
SymbolicValue peekValue = ps.peekValue();
assertThat(peekValue).isEqualTo(sv2);
ConstraintsByDomain constraints = ps.getConstraints(peekValue);
assertThat(constraints.get(ZeroConstraint.class)).isEqualTo(ZeroConstraint.ZERO);
assertThat(constraints.get(BooleanConstraint.class)).isEqualTo(BooleanConstraint.FALSE);
ps = execute(instruction, zeroNonZeroPs);
peekValue = ps.peekValue();
assertThat(peekValue).isEqualTo(sv1);
constraints = ps.getConstraints(peekValue);
assertThat(constraints.get(ZeroConstraint.class)).isEqualTo(ZeroConstraint.ZERO);
assertThat(constraints.get(BooleanConstraint.class)).isEqualTo(BooleanConstraint.FALSE);
ps = execute(instruction, nonZeroZeroPs);
peekValue = ps.peekValue();
assertThat(peekValue).isEqualTo(sv2);
constraints = ps.getConstraints(peekValue);
assertThat(constraints.get(ZeroConstraint.class)).isEqualTo(ZeroConstraint.ZERO);
assertThat(constraints.get(BooleanConstraint.class)).isEqualTo(BooleanConstraint.FALSE);
ps = execute(instruction, nonZeroNonZeroPs);
peekValue = ps.peekValue();
assertThat(peekValue).isNotIn(sv1, sv2);
constraints = ps.getConstraints(peekValue);
assertThat(constraints.get(ZeroConstraint.class)).isEqualTo(ZeroConstraint.NON_ZERO);
assertThat(constraints.get(BooleanConstraint.class)).isNull();
ps = execute(instruction, noConstraints);
peekValue = ps.peekValue();
assertThat(peekValue).isNotIn(sv1, sv2);
constraints = ps.getConstraints(peekValue);
assertThat(constraints.get(ZeroConstraint.class)).isNull();
assertThat(constraints.get(BooleanConstraint.class)).isNull();
}
}
use of org.sonar.java.se.symbolicvalues.SymbolicValue in project sonar-java by SonarSource.
the class BytecodeSECheckTest method setUp.
@Before
public void setUp() {
sv1 = new SymbolicValue();
sv2 = new SymbolicValue();
zeroZeroPs = ProgramState.EMPTY_STATE;
zeroZeroPs = zeroZeroPs.stackValue(sv1).addConstraints(sv1, ConstraintsByDomain.empty().put(ZeroConstraint.ZERO).put(BooleanConstraint.FALSE));
zeroZeroPs = zeroZeroPs.stackValue(sv2).addConstraints(sv2, ConstraintsByDomain.empty().put(ZeroConstraint.ZERO).put(BooleanConstraint.FALSE));
zeroNonZeroPs = ProgramState.EMPTY_STATE;
zeroNonZeroPs = zeroNonZeroPs.stackValue(sv1).addConstraints(sv1, ConstraintsByDomain.empty().put(ZeroConstraint.ZERO).put(BooleanConstraint.FALSE));
zeroNonZeroPs = zeroNonZeroPs.stackValue(sv2).addConstraints(sv2, ConstraintsByDomain.empty().put(ZeroConstraint.NON_ZERO).put(BooleanConstraint.TRUE));
nonZeroZeroPs = ProgramState.EMPTY_STATE;
nonZeroZeroPs = nonZeroZeroPs.stackValue(sv1).addConstraints(sv1, ConstraintsByDomain.empty().put(ZeroConstraint.NON_ZERO).put(BooleanConstraint.TRUE));
nonZeroZeroPs = nonZeroZeroPs.stackValue(sv2).addConstraints(sv2, ConstraintsByDomain.empty().put(ZeroConstraint.ZERO).put(BooleanConstraint.FALSE));
nonZeroNonZeroPs = ProgramState.EMPTY_STATE;
nonZeroNonZeroPs = nonZeroNonZeroPs.stackValue(sv1).addConstraints(sv1, ConstraintsByDomain.empty().put(ZeroConstraint.NON_ZERO));
nonZeroNonZeroPs = nonZeroNonZeroPs.stackValue(sv2).addConstraints(sv2, ConstraintsByDomain.empty().put(ZeroConstraint.NON_ZERO));
noConstraints = ProgramState.EMPTY_STATE.stackValue(sv1).stackValue(sv2);
}
use of org.sonar.java.se.symbolicvalues.SymbolicValue in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method test_dup_x2.
@Test
public void test_dup_x2() throws Exception {
SymbolicValue sv1 = new SymbolicValue();
SymbolicValue sv2 = new SymbolicValue();
SymbolicValue sv3 = new SymbolicValue();
ProgramState programState = execute(new Instruction(Opcodes.DUP_X2), ProgramState.EMPTY_STATE.stackValue(sv3).stackValue(sv2).stackValue(sv1));
ProgramState.Pop pop = programState.unstackValue(4);
assertThat(pop.values).containsExactly(sv1, sv2, sv3, sv1);
assertThat(pop.state).isEqualTo(ProgramState.EMPTY_STATE);
assertThatThrownBy(() -> execute(new Instruction(Opcodes.DUP_X2), ProgramState.EMPTY_STATE.stackValue(sv1).stackValue(sv2))).hasMessage("DUP_X2 needs 3 values on stack");
}
Aggregations