@Override public void visitNode(Tree tree) { ControlFlowGraph cfg = ControlFlowGraph.build(tree, context()); if (cfg == null) { return; } Scope scope = context().symbolTable().getScopeFor(tree); if (scope == null || scope.hasUnresolvedCompact()) { return; } if (containsTryCatchBlock(tree)) { return; } LiveVariablesAnalysis lva = LiveVariablesAnalysis.analyze(cfg, context().symbolTable()); cfg.blocks().forEach(block -> verifyBlock(block, lva.getLiveVariables(block), lva.getReadSymbols())); }
private void verifyLiveVariableAnalysis(String argsList, String body) { CompilationUnitTree cut = parse("<?php function f(" + argsList + ") { " + body + " }", PHPLexicalGrammar.COMPILATION_UNIT); SymbolTableImpl symbolTable = SymbolTableImpl.create(cut); FunctionDeclarationTree functionTree = (FunctionDeclarationTree) cut.script().statements().get(0); ControlFlowGraph cfg = ControlFlowGraph.build(functionTree.body()); LiveVariablesAnalysis analysis = LiveVariablesAnalysis.analyze(cfg, symbolTable); Validator.assertLiveVariables(cfg, analysis); }
@Override public void visitNode(Tree tree) { ControlFlowGraph cfg = ControlFlowGraph.build(tree, context()); if (cfg == null) { return; } Scope scope = context().symbolTable().getScopeFor(tree); if (scope == null || scope.hasUnresolvedCompact()) { return; } if (containsTryCatchBlock(tree)) { return; } LiveVariablesAnalysis lva = LiveVariablesAnalysis.analyze(cfg, context().symbolTable()); cfg.blocks().forEach(block -> verifyBlock(block, lva.getLiveVariables(block), lva.getReadSymbols())); }
@Test public void read_symbols() { String body = "" + "$foo = 1;" + "$bar = bar();" + "$bar += bar();" + "read($bar);" + "$qix += 1 + 2;"; CompilationUnitTree cut = parse("<?php function f() { " + body + " }", PHPLexicalGrammar.COMPILATION_UNIT); SymbolTableImpl symbolTable = SymbolTableImpl.create(cut); FunctionDeclarationTree functionTree = (FunctionDeclarationTree) cut.script().statements().get(0); ControlFlowGraph cfg = ControlFlowGraph.build(functionTree.body()); LiveVariablesAnalysis analysis = LiveVariablesAnalysis.analyze(cfg, symbolTable); Set<Symbol> readSymbols = analysis.getReadSymbols(); assertThat(readSymbols).extracting("name").containsExactlyInAnyOrder("$bar", "$qix"); }