Skip to content

Commit 6737ce1

Browse files
committed
Fix quality flaw
1 parent 66ad2aa commit 6737ce1

1 file changed

Lines changed: 122 additions & 95 deletions

File tree

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

Lines changed: 122 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,7 @@ private void handleBlockExit(ExplodedGraph.ProgramPoint programPosition) {
210210
handleBranch(block, ((ConditionalExpressionTree) terminator).condition());
211211
return;
212212
case FOR_STATEMENT:
213-
ForStatementTree forStatement = (ForStatementTree) terminator;
214-
ExpressionTree condition = forStatement.condition();
213+
ExpressionTree condition = ((ForStatementTree) terminator).condition();
215214
if (condition != null) {
216215
handleBranch(block, condition, false);
217216
return;
@@ -266,52 +265,19 @@ private void visit(Tree tree, @Nullable Tree terminator) {
266265
}
267266
switch (tree.kind()) {
268267
case METHOD_INVOCATION:
269-
MethodInvocationTree mit = (MethodInvocationTree) tree;
270-
setSymbolicValueOnFields(mit);
271-
// unstack arguments and method identifier
272-
273-
programState = programState.unstackValue(mit.arguments().size() + 1).a;
274-
logState(mit);
275-
programState = programState.stackValue(constraintManager.createSymbolicValue(mit));
268+
executeMethodInvocation((MethodInvocationTree) tree);
276269
break;
277270
case LABELED_STATEMENT:
278271
case SWITCH_STATEMENT:
279272
case EXPRESSION_STATEMENT:
280273
case PARENTHESIZED_EXPRESSION:
281274
throw new IllegalStateException("Cannot appear in CFG: " + tree.kind().name());
282275
case VARIABLE:
283-
VariableTree variableTree = (VariableTree) tree;
284-
ExpressionTree initializer = variableTree.initializer();
285-
if (initializer == null) {
286-
SymbolicValue sv = null;
287-
if (terminator != null && terminator.is(Tree.Kind.FOR_EACH_STATEMENT)) {
288-
sv = constraintManager.createSymbolicValue(variableTree);
289-
} else if (variableTree.type().symbolType().is("boolean")) {
290-
sv = SymbolicValue.FALSE_LITERAL;
291-
} else if (!variableTree.type().symbolType().isPrimitive()) {
292-
sv = SymbolicValue.NULL_LITERAL;
293-
}
294-
if (sv != null) {
295-
programState = programState.put(variableTree.symbol(), sv);
296-
}
297-
} else {
298-
299-
Pair<ProgramState, List<SymbolicValue>> unstack = programState.unstackValue(1);
300-
programState = unstack.a;
301-
programState = programState.put(variableTree.symbol(), unstack.b.get(0));
302-
}
276+
executeVariable((VariableTree) tree, terminator);
303277
break;
304278
case TYPE_CAST:
305-
TypeCastTree typeCast = (TypeCastTree) tree;
306-
Type type = typeCast.type().symbolType();
307-
if (type.isPrimitive()) {
308-
309-
Pair<ProgramState, List<SymbolicValue>> unstack = programState.unstackValue(1);
310-
programState = unstack.a;
311-
programState = programState.stackValue(constraintManager.createSymbolicValue(typeCast.expression()));
312-
}
279+
executeTypeCast((TypeCastTree) tree);
313280
break;
314-
315281
case ASSIGNMENT:
316282
case MULTIPLY_ASSIGNMENT:
317283
case DIVIDE_ASSIGNMENT:
@@ -324,40 +290,16 @@ private void visit(Tree tree, @Nullable Tree terminator) {
324290
case AND_ASSIGNMENT:
325291
case XOR_ASSIGNMENT:
326292
case OR_ASSIGNMENT:
327-
ExpressionTree variable = ((AssignmentExpressionTree) tree).variable();
328-
if (variable.is(Tree.Kind.IDENTIFIER)) {
329-
// FIXME restricted to identifiers for now.
330-
331-
Pair<ProgramState, List<SymbolicValue>> unstack = programState.unstackValue(2);
332-
SymbolicValue value = unstack.b.get(1);
333-
programState = unstack.a;
334-
programState = programState.put(((IdentifierTree) variable).symbol(), value);
335-
programState = programState.stackValue(value);
336-
}
293+
executeAssignement((AssignmentExpressionTree) tree);
337294
break;
338295
case ARRAY_ACCESS_EXPRESSION:
339-
ArrayAccessExpressionTree arrayAccessExpressionTree = (ArrayAccessExpressionTree) tree;
340-
// unstack expression and dimension
341-
342-
Pair<ProgramState, List<SymbolicValue>> unstack = programState.unstackValue(2);
343-
programState = unstack.a;
344-
programState = programState.stackValue(constraintManager.createSymbolicValue(arrayAccessExpressionTree));
296+
executeArrayAccessExpression((ArrayAccessExpressionTree) tree);
345297
break;
346298
case NEW_ARRAY:
347-
NewArrayTree newArrayTree = (NewArrayTree) tree;
348-
349-
programState = programState.unstackValue(newArrayTree.initializers().size()).a;
350-
SymbolicValue svNewArray = constraintManager.createSymbolicValue(newArrayTree);
351-
programState = programState.stackValue(svNewArray);
352-
programState = svNewArray.setSingleConstraint(programState, NullConstraint.NOT_NULL);
299+
executeNewArray((NewArrayTree) tree);
353300
break;
354301
case NEW_CLASS:
355-
NewClassTree newClassTree = (NewClassTree) tree;
356-
357-
programState = programState.unstackValue(newClassTree.arguments().size()).a;
358-
SymbolicValue svNewClass = constraintManager.createSymbolicValue(newClassTree);
359-
programState = programState.stackValue(svNewClass);
360-
programState = svNewClass.setSingleConstraint(programState, NullConstraint.NOT_NULL);
302+
executeNewClass((NewClassTree) tree);
361303
break;
362304
case MULTIPLY:
363305
case DIVIDE:
@@ -376,13 +318,7 @@ private void visit(Tree tree, @Nullable Tree terminator) {
376318
case LESS_THAN_OR_EQUAL_TO:
377319
case EQUAL_TO:
378320
case NOT_EQUAL_TO:
379-
// Consume two and produce one SV.
380-
381-
Pair<ProgramState, List<SymbolicValue>> unstackBinary = programState.unstackValue(2);
382-
programState = unstackBinary.a;
383-
SymbolicValue symbolicValue = constraintManager.createSymbolicValue(tree);
384-
symbolicValue.computedFrom(unstackBinary.b);
385-
programState = programState.stackValue(symbolicValue);
321+
executeBinaryExpression(tree);
386322
break;
387323
case POSTFIX_INCREMENT:
388324
case POSTFIX_DECREMENT:
@@ -393,32 +329,13 @@ private void visit(Tree tree, @Nullable Tree terminator) {
393329
case BITWISE_COMPLEMENT:
394330
case LOGICAL_COMPLEMENT:
395331
case INSTANCE_OF:
396-
// consume one and produce one
397-
398-
Pair<ProgramState, List<SymbolicValue>> unstackUnary = programState.unstackValue(1);
399-
programState = unstackUnary.a;
400-
SymbolicValue unarySymbolicValue = constraintManager.createSymbolicValue(tree);
401-
unarySymbolicValue.computedFrom(unstackUnary.b);
402-
programState = programState.stackValue(unarySymbolicValue);
332+
executeUnaryExpression(tree);
403333
break;
404334
case IDENTIFIER:
405-
Symbol symbol = ((IdentifierTree) tree).symbol();
406-
SymbolicValue value = programState.getValue(symbol);
407-
if (value == null) {
408-
value = constraintManager.createSymbolicValue(tree);
409-
programState = programState.put(symbol, value);
410-
}
411-
programState = programState.stackValue(value);
335+
executeIdentifier((IdentifierTree) tree);
412336
break;
413337
case MEMBER_SELECT:
414-
MemberSelectExpressionTree mse = (MemberSelectExpressionTree) tree;
415-
if (!"class".equals(mse.identifier().name())) {
416-
417-
Pair<ProgramState, List<SymbolicValue>> unstackMSE = programState.unstackValue(1);
418-
programState = unstackMSE.a;
419-
}
420-
SymbolicValue mseValue = constraintManager.createSymbolicValue(tree);
421-
programState = programState.stackValue(mseValue);
338+
executeMemberSelect(((MemberSelectExpressionTree) tree));
422339
break;
423340
case INT_LITERAL:
424341
case LONG_LITERAL:
@@ -442,6 +359,116 @@ private void visit(Tree tree, @Nullable Tree terminator) {
442359
clearStack(tree);
443360
}
444361

362+
private void executeMethodInvocation(MethodInvocationTree mit) {
363+
setSymbolicValueOnFields(mit);
364+
// unstack arguments and method identifier
365+
programState = programState.unstackValue(mit.arguments().size() + 1).a;
366+
logState(mit);
367+
programState = programState.stackValue(constraintManager.createSymbolicValue(mit));
368+
}
369+
370+
private void executeVariable(VariableTree variableTree, @Nullable Tree terminator) {
371+
ExpressionTree initializer = variableTree.initializer();
372+
if (initializer == null) {
373+
SymbolicValue sv = null;
374+
if (terminator != null && terminator.is(Tree.Kind.FOR_EACH_STATEMENT)) {
375+
sv = constraintManager.createSymbolicValue(variableTree);
376+
} else if (variableTree.type().symbolType().is("boolean")) {
377+
sv = SymbolicValue.FALSE_LITERAL;
378+
} else if (!variableTree.type().symbolType().isPrimitive()) {
379+
sv = SymbolicValue.NULL_LITERAL;
380+
}
381+
if (sv != null) {
382+
programState = programState.put(variableTree.symbol(), sv);
383+
}
384+
} else {
385+
Pair<ProgramState, List<SymbolicValue>> unstack = programState.unstackValue(1);
386+
programState = unstack.a;
387+
programState = programState.put(variableTree.symbol(), unstack.b.get(0));
388+
}
389+
}
390+
391+
private void executeTypeCast(TypeCastTree typeCast) {
392+
Type type = typeCast.type().symbolType();
393+
if (type.isPrimitive()) {
394+
Pair<ProgramState, List<SymbolicValue>> unstack = programState.unstackValue(1);
395+
programState = unstack.a;
396+
programState = programState.stackValue(constraintManager.createSymbolicValue(typeCast.expression()));
397+
}
398+
}
399+
400+
private void executeAssignement(AssignmentExpressionTree tree) {
401+
ExpressionTree variable = tree.variable();
402+
if (variable.is(Tree.Kind.IDENTIFIER)) {
403+
// FIXME restricted to identifiers for now.
404+
Pair<ProgramState, List<SymbolicValue>> unstack = programState.unstackValue(2);
405+
SymbolicValue value = unstack.b.get(1);
406+
programState = unstack.a;
407+
programState = programState.put(((IdentifierTree) variable).symbol(), value);
408+
programState = programState.stackValue(value);
409+
}
410+
}
411+
412+
private void executeArrayAccessExpression(ArrayAccessExpressionTree tree) {
413+
// unstack expression and dimension
414+
Pair<ProgramState, List<SymbolicValue>> unstack = programState.unstackValue(2);
415+
programState = unstack.a;
416+
programState = programState.stackValue(constraintManager.createSymbolicValue(tree));
417+
}
418+
419+
private void executeNewArray(NewArrayTree newArrayTree) {
420+
programState = programState.unstackValue(newArrayTree.initializers().size()).a;
421+
SymbolicValue svNewArray = constraintManager.createSymbolicValue(newArrayTree);
422+
programState = programState.stackValue(svNewArray);
423+
programState = svNewArray.setSingleConstraint(programState, NullConstraint.NOT_NULL);
424+
}
425+
426+
private void executeNewClass(NewClassTree tree) {
427+
NewClassTree newClassTree = tree;
428+
programState = programState.unstackValue(newClassTree.arguments().size()).a;
429+
SymbolicValue svNewClass = constraintManager.createSymbolicValue(newClassTree);
430+
programState = programState.stackValue(svNewClass);
431+
programState = svNewClass.setSingleConstraint(programState, NullConstraint.NOT_NULL);
432+
}
433+
434+
private void executeBinaryExpression(Tree tree) {
435+
// Consume two and produce one SV.
436+
Pair<ProgramState, List<SymbolicValue>> unstackBinary = programState.unstackValue(2);
437+
programState = unstackBinary.a;
438+
SymbolicValue symbolicValue = constraintManager.createSymbolicValue(tree);
439+
symbolicValue.computedFrom(unstackBinary.b);
440+
programState = programState.stackValue(symbolicValue);
441+
}
442+
443+
private void executeUnaryExpression(Tree tree) {
444+
// consume one and produce one
445+
Pair<ProgramState, List<SymbolicValue>> unstackUnary = programState.unstackValue(1);
446+
programState = unstackUnary.a;
447+
SymbolicValue unarySymbolicValue = constraintManager.createSymbolicValue(tree);
448+
unarySymbolicValue.computedFrom(unstackUnary.b);
449+
programState = programState.stackValue(unarySymbolicValue);
450+
}
451+
452+
private void executeIdentifier(IdentifierTree tree) {
453+
Symbol symbol = tree.symbol();
454+
SymbolicValue value = programState.getValue(symbol);
455+
if (value == null) {
456+
value = constraintManager.createSymbolicValue(tree);
457+
programState = programState.put(symbol, value);
458+
}
459+
programState = programState.stackValue(value);
460+
}
461+
462+
private void executeMemberSelect(MemberSelectExpressionTree mse) {
463+
if (!"class".equals(mse.identifier().name())) {
464+
465+
Pair<ProgramState, List<SymbolicValue>> unstackMSE = programState.unstackValue(1);
466+
programState = unstackMSE.a;
467+
}
468+
SymbolicValue mseValue = constraintManager.createSymbolicValue(mse);
469+
programState = programState.stackValue(mseValue);
470+
}
471+
445472
public void clearStack(Tree tree) {
446473
if (tree.parent().is(Tree.Kind.EXPRESSION_STATEMENT)) {
447474
programState = programState.clearStack();

0 commit comments

Comments
 (0)