From 3a0093d463f7c7238901962a47c7ac15bd0ac9a8 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 3 Apr 2014 13:09:18 +0200 Subject: [PATCH] fix AIOOBE in dfa contract processing --- .../codeInspection/dataFlow/ControlFlowAnalyzer.java | 10 ++++------ .../inspection/dataFlow/fixture/ContractVarargs.java | 11 ++++++++++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index b8dd18eb5295..1be69b51a700 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -1450,19 +1450,17 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { addInstruction(new DupInstruction(args.length, contracts.size() - 1)); } for (int i = 0; i < contracts.size(); i++) { - handleContract(expression, contracts.get(i), contracts.size() - 1 - i); + handleContract(expression, contracts.get(i), contracts.size() - 1 - i, paramCount); } pushUnknownReturnValue(expression); // goto here if all contracts are false return true; } - private void handleContract(PsiMethodCallExpression expression, MethodContract contract, int remainingContracts) { - PsiExpression[] args = expression.getArgumentList().getExpressions(); - + private void handleContract(PsiMethodCallExpression expression, MethodContract contract, int remainingContracts, int paramCount) { final ControlFlow.ControlFlowOffset exitPoint = getEndOffset(expression); List gotoContractFalse = new SmartList(); - for (int i = args.length - 1; i >= 0; i--) { + for (int i = paramCount - 1; i >= 0; i--) { ValueConstraint arg = contract.arguments[i]; if (arg == ValueConstraint.NULL_VALUE || arg == ValueConstraint.NOT_NULL_VALUE) { addInstruction(new PushInstruction(myFactory.getConstFactory().getNull(), null)); @@ -1483,7 +1481,7 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { continueCheckingContract.setOffset(myCurrentFlow.getInstructionCount()); } - for (int j = 0; j < remainingContracts * args.length; j++) { + for (int j = 0; j < remainingContracts * paramCount; j++) { addInstruction(new PopInstruction()); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ContractVarargs.java b/java/java-tests/testData/inspection/dataFlow/fixture/ContractVarargs.java index 0c5e43d8a038..e65bc8740e83 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/ContractVarargs.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ContractVarargs.java @@ -21,7 +21,16 @@ class Contracts { public void varargFail(@Nullable String message) { notBlank(message, "Message should not be blank"); - log(message); // highlighted + log(message); + } + + public void vararg1(@Nullable String message) { + notBlank(message, "Message should not be blank", new Object()); + log(message); + } + public void vararg2(@Nullable String message) { + notBlank(message, "Message should not be blank", new Object(), new Object()); + log(message); } public void log(@NotNull String message) {