@@ -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