Skip to content

Commit d26cd6c

Browse files
committed
SONARJAVA-1488 - Detect that a>=b and a<= b implies that a==b
1 parent aa35bbf commit d26cd6c

37 files changed

Lines changed: 2650 additions & 2127 deletions

java-squid/src/main/java/org/sonar/java/se/CheckerContext.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.sonar.java.se;
2121

2222
import org.sonar.java.se.checks.SECheck;
23+
import org.sonar.java.se.symbolicvalues.SymbolicValue;
2324
import org.sonar.plugins.java.api.tree.Tree;
2425

2526
public interface CheckerContext {

java-squid/src/main/java/org/sonar/java/se/CheckerDispatcher.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.sonar.java.model.DefaultJavaFileScannerContext;
2323
import org.sonar.java.se.checks.SECheck;
24+
import org.sonar.java.se.symbolicvalues.SymbolicValue;
2425
import org.sonar.plugins.java.api.JavaFileScannerContext;
2526
import org.sonar.plugins.java.api.tree.MethodTree;
2627
import org.sonar.plugins.java.api.tree.Tree;

java-squid/src/main/java/org/sonar/java/se/ConstraintManager.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
package org.sonar.java.se;
2121

2222
import com.google.common.base.Preconditions;
23+
import com.google.common.collect.ImmutableList;
24+
import org.sonar.java.se.symbolicvalues.RelationalSymbolicValue;
25+
import org.sonar.java.se.symbolicvalues.SymbolicValue;
2326
import org.sonar.plugins.java.api.semantic.Symbol;
2427
import org.sonar.plugins.java.api.semantic.Type;
2528
import org.sonar.plugins.java.api.tree.ExpressionTree;
@@ -45,10 +48,22 @@ public SymbolicValue createSymbolicValue(Tree syntaxNode) {
4548
SymbolicValue result;
4649
switch (syntaxNode.kind()) {
4750
case EQUAL_TO:
48-
result = new SymbolicValue.EqualToSymbolicValue(counter);
51+
result = new RelationalSymbolicValue(counter, RelationalSymbolicValue.Kind.EQUAL);
4952
break;
5053
case NOT_EQUAL_TO:
51-
result = new SymbolicValue.NotEqualToSymbolicValue(counter);
54+
result = new RelationalSymbolicValue(counter, RelationalSymbolicValue.Kind.NOT_EQUAL);
55+
break;
56+
case LESS_THAN:
57+
result = new RelationalSymbolicValue(counter, RelationalSymbolicValue.Kind.LESS_THAN);
58+
break;
59+
case LESS_THAN_OR_EQUAL_TO:
60+
result = new RelationalSymbolicValue(counter, RelationalSymbolicValue.Kind.LESS_THAN_OR_EQUAL);
61+
break;
62+
case GREATER_THAN:
63+
result = new RelationalSymbolicValue(counter, RelationalSymbolicValue.Kind.GREATER_THAN);
64+
break;
65+
case GREATER_THAN_OR_EQUAL_TO:
66+
result = new RelationalSymbolicValue(counter, RelationalSymbolicValue.Kind.GREATER_THAN_OR_EQUAL);
5267
break;
5368
case LOGICAL_COMPLEMENT:
5469
result = new SymbolicValue.NotSymbolicValue(counter);
@@ -84,8 +99,10 @@ public SymbolicValue createSymbolicValue(Tree syntaxNode) {
8499
public SymbolicValue createMethodSymbolicValue(MethodInvocationTree syntaxNode, List<SymbolicValue> values) {
85100
SymbolicValue result;
86101
if (isEqualsMethod(syntaxNode)) {
87-
result = new SymbolicValue.MethodEqualsToSymbolicValue(counter);
88-
result.computedFrom(values);
102+
result = new RelationalSymbolicValue(counter, RelationalSymbolicValue.Kind.METHOD_EQUALS);
103+
SymbolicValue leftOp = values.get(0);
104+
SymbolicValue rightOp = values.get(1);
105+
result.computedFrom(ImmutableList.of(rightOp, leftOp));
89106
} else {
90107
result = createDefaultSymbolicValue(syntaxNode);
91108
}
@@ -155,7 +172,7 @@ public Pair<List<ProgramState>, List<ProgramState>> assumeDual(ProgramState prog
155172
public enum BooleanConstraint {
156173
TRUE,
157174
FALSE;
158-
BooleanConstraint inverse() {
175+
public BooleanConstraint inverse() {
159176
if (TRUE == this) {
160177
return FALSE;
161178
}

java-squid/src/main/java/org/sonar/java/se/EqualRelation.java

Lines changed: 0 additions & 137 deletions
This file was deleted.

java-squid/src/main/java/org/sonar/java/se/ExplodedGraphWalker.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.sonar.java.se.checks.NullDereferenceCheck;
3737
import org.sonar.java.se.checks.SECheck;
3838
import org.sonar.java.se.checks.UnclosedResourcesCheck;
39+
import org.sonar.java.se.symbolicvalues.SymbolicValue;
3940
import org.sonar.plugins.java.api.JavaFileScannerContext;
4041
import org.sonar.plugins.java.api.semantic.Symbol;
4142
import org.sonar.plugins.java.api.semantic.SymbolMetadata;

java-squid/src/main/java/org/sonar/java/se/GreaterThanOrEqualRelation.java

Lines changed: 0 additions & 142 deletions
This file was deleted.

0 commit comments

Comments
 (0)