[java-inspections] Detect new object from variable inside the loop

GitOrigin-RevId: b9f8537d8cea84fee3a008ec678d09e089205d52
This commit is contained in:
Tagir Valeev
2022-06-11 10:02:29 +00:00
committed by intellij-monorepo-bot
parent 03b48aad2d
commit dbab8896c5
3 changed files with 16 additions and 5 deletions
@@ -9,7 +9,6 @@ import com.intellij.psi.*;
import com.intellij.psi.controlFlow.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.containers.ContainerUtil;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
@@ -21,8 +20,8 @@ import com.siyeh.ig.psiutils.VariableAccessUtils;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import static com.intellij.util.ObjectUtils.tryCast;
@@ -99,8 +98,9 @@ public class NewObjectEqualityInspection extends BaseInspection {
catch (AnalysisCanceledException e) {
return expression;
}
int start = flow.getEndOffset(initializer) + 1;
if (ControlFlowUtils.isVariableReferencedBeforeStatementEntry(flow, start, expression, variable, Collections.emptySet())) {
int initializerEnd = flow.getEndOffset(initializer);
int start = initializerEnd + 1;
if (ControlFlowUtils.isVariableReferencedBeforeStatementEntry(flow, start, expression, variable, Set.of(initializerEnd))) {
return expression;
}
return initializer;
@@ -880,7 +880,7 @@ public final class ControlFlowUtils {
if (to == statementStart && (from < statementStart || from >= statementEnd)) {
return true;
}
if (!referenced.get(to)) {
if (!referenced.get(to) && !excluded.contains(to)) {
referenced.set(to);
changed = true;
}
@@ -4,6 +4,17 @@ import java.util.*;
public class ControlFlow
{
void nonLeak(Object obj) {
while (true) {
Object obj2 = new Object();
if (obj == <warning descr="New object is compared using '=='">obj2</warning>) {
System.out.println("equal");
} else {
if (Math.random() > 0.5) return;
}
}
}
void test() {
while (true) {
Object obj = new Object();