@VisibleForTesting protected ExplodedGraphWalker(List<SECheck> seChecks, BehaviorCache behaviorCache, SemanticModel semanticModel) { this.alwaysTrueOrFalseExpressionCollector = new AlwaysTrueOrFalseExpressionCollector(); this.checkerDispatcher = new CheckerDispatcher(this, seChecks); this.behaviorCache = behaviorCache; this.semanticModel = semanticModel; }
public void executeCheckPostStatement(Tree syntaxNode) { this.syntaxNode = syntaxNode; addTransition(explodedGraphWalker.programState); }
@Override public void addTransition(ProgramState state) { ProgramState oldState = explodedGraphWalker.programState; explodedGraphWalker.programState = state; currentCheckerIndex++; executePost(); currentCheckerIndex--; explodedGraphWalker.programState = oldState; this.transition = true; }
private void execute(MethodTree tree) { CFG cfg = CFG.build(tree); exitBlock = cfg.exitBlock(); checkerDispatcher.init(tree, cfg); liveVariables = LiveVariables.analyze(cfg); explodedGraph = new ExplodedGraph(); } else if (programPosition.i == block.elements().size()) { checkerDispatcher.executeCheckPostStatement(terminator); } else { checkerDispatcher.executeCheckPreStatement(terminator); handleBlockExit(programPosition); checkerDispatcher.executeCheckEndOfExecution();
private void visit(Tree tree, @Nullable Tree terminator) { LOG.debug("visiting node " + tree.kind().name() + " at line " + ((JavaTree) tree).getLine()); if (!checkerDispatcher.executeCheckPreStatement(tree)) { checkerDispatcher.executeCheckPostStatement(tree); clearStack(tree);
@Override public void reportIssue(Tree tree, SECheck check, String message) { reportIssue(tree, check, message, Collections.emptySet()); }
private void handleEndOfExecutionPath(boolean interrupted) { ExplodedGraph.Node savedNode = node; endOfExecutionPath.forEach(n -> { setNode(n); checkerDispatcher.executeCheckEndOfExecutionPath(constraintManager); if (!interrupted && methodBehavior != null) { methodBehavior.createYield(node); } }); setNode(savedNode); }
checkerDispatcher.executeCheckPostStatement(mit); clearStack(mit);
private void interrupted(Exception cause) { handleEndOfExecutionPath(true); checkerDispatcher.interruptedExecution(cause); }
private void execute(MethodTree tree) { CFG cfg = CFG.build(tree); exitBlock = cfg.exitBlock(); checkerDispatcher.init(tree, cfg); liveVariables = LiveVariables.analyze(cfg); explodedGraph = new ExplodedGraph(); } else if (programPosition.i == block.elements().size()) { checkerDispatcher.executeCheckPostStatement(terminator); } else { checkerDispatcher.executeCheckPreStatement(terminator); handleBlockExit(programPosition); checkerDispatcher.executeCheckEndOfExecution();
private void visit(Tree tree, @Nullable Tree terminator) { if (!checkerDispatcher.executeCheckPreStatement(tree)) { checkerDispatcher.executeCheckPostStatement(tree); clearStack(tree);
@Override public void reportIssue(Tree tree, SECheck check, String message) { reportIssue(tree, check, message, Collections.emptySet()); }
private void handleEndOfExecutionPath(boolean interrupted) { ExplodedGraph.Node savedNode = node; endOfExecutionPath.forEach(n -> { setNode(n); checkerDispatcher.executeCheckEndOfExecutionPath(constraintManager); if (!interrupted && methodBehavior != null) { methodBehavior.createYield(node); } }); setNode(savedNode); }
checkerDispatcher.executeCheckPostStatement(mit); clearStack(mit);
private void interrupted(Exception cause) { handleEndOfExecutionPath(true); checkerDispatcher.interruptedExecution(cause); }
private void execute(MethodTree tree) { checkerDispatcher.init(); CFG cfg = CFG.build(tree); liveVariables = LiveVariables.analyze(cfg); programState = node.programState; if (programPosition.block.successors().isEmpty()) { checkerDispatcher.executeCheckEndOfExecutionPath(constraintManager); LOG.debug("End of potential path reached!"); continue; } else if (programPosition.i == programPosition.block.elements().size()) { checkerDispatcher.executeCheckPostStatement(programPosition.block.terminator()); } else { checkerDispatcher.executeCheckPreStatement(programPosition.block.terminator()); handleBlockExit(programPosition); checkerDispatcher.executeCheckEndOfExecution();
private void visit(Tree tree, @Nullable Tree terminator) { if (!checkerDispatcher.executeCheckPreStatement(tree)) { checkerDispatcher.executeCheckPostStatement(tree); clearStack(tree);
public void executeCheckPostStatement(Tree syntaxNode) { this.syntaxNode = syntaxNode; addTransition(explodedGraphWalker.programState); }
@VisibleForTesting protected ExplodedGraphWalker(List<SECheck> seChecks, BehaviorCache behaviorCache, SemanticModel semanticModel) { this.alwaysTrueOrFalseExpressionCollector = new AlwaysTrueOrFalseExpressionCollector(); this.checkerDispatcher = new CheckerDispatcher(this, seChecks); this.behaviorCache = behaviorCache; this.semanticModel = semanticModel; }
@Override public void addTransition(ProgramState state) { ProgramState oldState = explodedGraphWalker.programState; explodedGraphWalker.programState = state; currentCheckerIndex++; executePost(); currentCheckerIndex--; explodedGraphWalker.programState = oldState; this.transition = true; }