diff --git a/java/src/security/Recursion/Recursion.ql b/java/src/security/Recursion/Recursion.ql index 55891d5..453da8f 100644 --- a/java/src/security/Recursion/Recursion.ql +++ b/java/src/security/Recursion/Recursion.ql @@ -19,11 +19,10 @@ predicate isTestPackage(RefType referenceType) { referenceType.getName().toLowerCase().matches("%test%") } -class RecursionSource extends MethodCall { - RecursionSource() { not isTestPackage(this.getCaller().getDeclaringType()) } - - override string toString() { - result = this.getCaller().toString() + " calls " + this.getCallee().toString() +class RecursionSource extends Method { + RecursionSource() { + not isTestPackage(this.getDeclaringType()) and + this.calls+(this) } } @@ -43,36 +42,27 @@ module RecursiveConfig implements DataFlow::StateConfigSig { class FlowState = Method; predicate isSource(DataFlow::Node node, FlowState firstMethod) { - node.asExpr() instanceof RecursionSource and - firstMethod = node.asExpr().(MethodCall).getCaller() + node.asExpr().(MethodCall).getCallee() instanceof RecursionSource and + firstMethod = node.asExpr().(MethodCall).getCallee() } predicate isSink(DataFlow::Node node, FlowState firstMethod) { - node.asExpr() instanceof RecursionSource and - firstMethod.calls+(node.asExpr().(MethodCall).getCaller()) and - node.asExpr().(MethodCall).getCallee().calls(firstMethod) + node.asExpr().(MethodCall).getCallee().calls(firstMethod) and + firstMethod.calls+(node.asExpr().(MethodCall).getCaller()) } predicate isBarrier(DataFlow::Node node) { exists(MethodCall ma | ma = node.asExpr() and exists(Expr e | e = ma.getAnArgument() and e instanceof ParameterOperation) - // or exists( - // VarAccess e| - // e = ma.getAnArgument() | - // e.getVariable().getAnAssignedValue().getAChildExpr() instanceof ParameterOperation - // ) ) } - - /** - * Weird but useful deduplication logic - */ - predicate isBarrierIn(DataFlow::Node node, FlowState state) { - not node.asExpr() instanceof MethodCall or - node.asExpr().(MethodCall).getCaller().getLocation().getStartLine() > - state.getLocation().getStartLine() - } + // /** + // * Weird but useful deduplication logic + // */ + // predicate isBarrierOut(DataFlow::Node node, FlowState state) { + // node.asExpr().(MethodCall).getCallee().getName() > state.getName() + // } } module RecursiveFlow = DataFlow::GlobalWithState; diff --git a/java/test/query-tests/security/Recursion/Recursion.expected b/java/test/query-tests/security/Recursion/Recursion.expected index 2b39bac..c3ffca1 100644 --- a/java/test/query-tests/security/Recursion/Recursion.expected +++ b/java/test/query-tests/security/Recursion/Recursion.expected @@ -1,73 +1,148 @@ edges -| Recursion.java:57:24:57:34 | readToken calls readToken : Token | Recursion.java:57:24:57:34 | readToken calls readToken | provenance | | -| Recursion.java:57:24:57:34 | readToken calls readToken : Token | Recursion.java:57:24:57:34 | readToken calls readToken : Token | provenance | | -| Recursion.java:81:16:81:32 | directRecursive calls directRecursive : Boolean | Recursion.java:81:16:81:32 | directRecursive calls directRecursive | provenance | | -| Recursion.java:81:16:81:32 | directRecursive calls directRecursive : Boolean | Recursion.java:81:16:81:32 | directRecursive calls directRecursive : Boolean | provenance | | -| Recursion.java:89:16:89:23 | level0 calls level1 : Boolean | Recursion.java:101:16:101:23 | level2 calls level0 : Boolean | provenance | | -| Recursion.java:95:16:95:23 | level1 calls level2 : Boolean | Recursion.java:89:16:89:23 | level0 calls level1 | provenance | | -| Recursion.java:95:16:95:23 | level1 calls level2 : Boolean | Recursion.java:89:16:89:23 | level0 calls level1 : Boolean | provenance | | -| Recursion.java:101:16:101:23 | level2 calls level0 : Boolean | Recursion.java:95:16:95:23 | level1 calls level2 : Boolean | provenance | | -| Recursion.java:116:20:116:27 | level0 calls level1 : Boolean | Recursion.java:130:16:130:23 | level2 calls level0 | provenance | | -| Recursion.java:116:20:116:27 | level0 calls level1 : Boolean | Recursion.java:130:16:130:23 | level2 calls level0 : Boolean | provenance | | -| Recursion.java:118:16:118:23 | level0 calls level2 : Boolean | Recursion.java:130:16:130:23 | level2 calls level0 | provenance | | -| Recursion.java:118:16:118:23 | level0 calls level2 : Boolean | Recursion.java:130:16:130:23 | level2 calls level0 : Boolean | provenance | | -| Recursion.java:124:16:124:23 | level1 calls level2 : Boolean | Recursion.java:116:20:116:27 | level0 calls level1 | provenance | | -| Recursion.java:124:16:124:23 | level1 calls level2 : Boolean | Recursion.java:116:20:116:27 | level0 calls level1 : Boolean | provenance | | -| Recursion.java:124:16:124:23 | level1 calls level2 : Boolean | Recursion.java:128:20:128:27 | level2 calls level1 | provenance | | -| Recursion.java:124:16:124:23 | level1 calls level2 : Boolean | Recursion.java:128:20:128:27 | level2 calls level1 : Boolean | provenance | | -| Recursion.java:128:20:128:27 | level2 calls level1 : Boolean | Recursion.java:118:16:118:23 | level0 calls level2 : Boolean | provenance | | -| Recursion.java:128:20:128:27 | level2 calls level1 : Boolean | Recursion.java:124:16:124:23 | level1 calls level2 : Boolean | provenance | | -| Recursion.java:130:16:130:23 | level2 calls level0 : Boolean | Recursion.java:118:16:118:23 | level0 calls level2 : Boolean | provenance | | -| Recursion.java:130:16:130:23 | level2 calls level0 : Boolean | Recursion.java:124:16:124:23 | level1 calls level2 : Boolean | provenance | | -| Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth : Boolean | Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth | provenance | | -| Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth : Boolean | Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth : Boolean | provenance | | -| Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow : Boolean | Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow | provenance | | -| Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow : Boolean | Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow : Boolean | provenance | | +| Recursion.java:57:24:57:34 | readToken(...) : Token | Recursion.java:57:24:57:34 | readToken(...) | provenance | | +| Recursion.java:57:24:57:34 | readToken(...) : Token | Recursion.java:57:24:57:34 | readToken(...) : Token | provenance | | +| Recursion.java:71:29:71:33 | foo(...) : Boolean | Recursion.java:72:16:72:24 | fooResult : Boolean | provenance | | +| Recursion.java:71:29:71:33 | foo(...) : Boolean | Recursion.java:72:16:72:24 | fooResult : Boolean | provenance | | +| Recursion.java:72:16:72:24 | fooResult : Boolean | Recursion.java:76:16:76:20 | bar(...) | provenance | | +| Recursion.java:72:16:72:24 | fooResult : Boolean | Recursion.java:76:16:76:20 | bar(...) : Boolean | provenance | | +| Recursion.java:72:16:72:24 | fooResult : Boolean | Recursion.java:76:16:76:20 | bar(...) : Boolean | provenance | | +| Recursion.java:76:16:76:20 | bar(...) : Boolean | Recursion.java:71:29:71:33 | foo(...) | provenance | | +| Recursion.java:76:16:76:20 | bar(...) : Boolean | Recursion.java:71:29:71:33 | foo(...) : Boolean | provenance | | +| Recursion.java:76:16:76:20 | bar(...) : Boolean | Recursion.java:71:29:71:33 | foo(...) : Boolean | provenance | | +| Recursion.java:81:16:81:32 | directRecursive(...) : Boolean | Recursion.java:81:16:81:32 | directRecursive(...) | provenance | | +| Recursion.java:81:16:81:32 | directRecursive(...) : Boolean | Recursion.java:81:16:81:32 | directRecursive(...) : Boolean | provenance | | +| Recursion.java:89:16:89:23 | level1(...) : Boolean | Recursion.java:101:16:101:23 | level0(...) | provenance | | +| Recursion.java:89:16:89:23 | level1(...) : Boolean | Recursion.java:101:16:101:23 | level0(...) : Boolean | provenance | | +| Recursion.java:89:16:89:23 | level1(...) : Boolean | Recursion.java:101:16:101:23 | level0(...) : Boolean | provenance | | +| Recursion.java:89:16:89:23 | level1(...) : Boolean | Recursion.java:101:16:101:23 | level0(...) : Boolean | provenance | | +| Recursion.java:95:16:95:23 | level2(...) : Boolean | Recursion.java:89:16:89:23 | level1(...) | provenance | | +| Recursion.java:95:16:95:23 | level2(...) : Boolean | Recursion.java:89:16:89:23 | level1(...) : Boolean | provenance | | +| Recursion.java:95:16:95:23 | level2(...) : Boolean | Recursion.java:89:16:89:23 | level1(...) : Boolean | provenance | | +| Recursion.java:95:16:95:23 | level2(...) : Boolean | Recursion.java:89:16:89:23 | level1(...) : Boolean | provenance | | +| Recursion.java:101:16:101:23 | level0(...) : Boolean | Recursion.java:95:16:95:23 | level2(...) | provenance | | +| Recursion.java:101:16:101:23 | level0(...) : Boolean | Recursion.java:95:16:95:23 | level2(...) : Boolean | provenance | | +| Recursion.java:101:16:101:23 | level0(...) : Boolean | Recursion.java:95:16:95:23 | level2(...) : Boolean | provenance | | +| Recursion.java:101:16:101:23 | level0(...) : Boolean | Recursion.java:95:16:95:23 | level2(...) : Boolean | provenance | | +| Recursion.java:116:20:116:27 | level1(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) | provenance | | +| Recursion.java:116:20:116:27 | level1(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) | provenance | | +| Recursion.java:116:20:116:27 | level1(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) : Boolean | provenance | | +| Recursion.java:116:20:116:27 | level1(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) : Boolean | provenance | | +| Recursion.java:116:20:116:27 | level1(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) : Boolean | provenance | | +| Recursion.java:118:16:118:23 | level2(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) | provenance | | +| Recursion.java:118:16:118:23 | level2(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) | provenance | | +| Recursion.java:118:16:118:23 | level2(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) : Boolean | provenance | | +| Recursion.java:118:16:118:23 | level2(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) : Boolean | provenance | | +| Recursion.java:118:16:118:23 | level2(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) : Boolean | provenance | | +| Recursion.java:124:16:124:23 | level2(...) : Boolean | Recursion.java:116:20:116:27 | level1(...) | provenance | | +| Recursion.java:124:16:124:23 | level2(...) : Boolean | Recursion.java:116:20:116:27 | level1(...) : Boolean | provenance | | +| Recursion.java:124:16:124:23 | level2(...) : Boolean | Recursion.java:116:20:116:27 | level1(...) : Boolean | provenance | | +| Recursion.java:124:16:124:23 | level2(...) : Boolean | Recursion.java:116:20:116:27 | level1(...) : Boolean | provenance | | +| Recursion.java:124:16:124:23 | level2(...) : Boolean | Recursion.java:128:20:128:27 | level1(...) | provenance | | +| Recursion.java:124:16:124:23 | level2(...) : Boolean | Recursion.java:128:20:128:27 | level1(...) : Boolean | provenance | | +| Recursion.java:124:16:124:23 | level2(...) : Boolean | Recursion.java:128:20:128:27 | level1(...) : Boolean | provenance | | +| Recursion.java:124:16:124:23 | level2(...) : Boolean | Recursion.java:128:20:128:27 | level1(...) : Boolean | provenance | | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) | provenance | | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) | provenance | | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) : Boolean | provenance | | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) : Boolean | provenance | | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) : Boolean | provenance | | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) | provenance | | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) | provenance | | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) : Boolean | provenance | | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) : Boolean | provenance | | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) : Boolean | provenance | | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) | provenance | | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) | provenance | | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) : Boolean | provenance | | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) : Boolean | provenance | | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) : Boolean | provenance | | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) | provenance | | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) | provenance | | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) : Boolean | provenance | | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) : Boolean | provenance | | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) : Boolean | provenance | | +| Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) : Boolean | Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) | provenance | | +| Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) : Boolean | Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) : Boolean | provenance | | +| Recursion.java:177:16:177:47 | directRecLocalFlow(...) : Boolean | Recursion.java:177:16:177:47 | directRecLocalFlow(...) | provenance | | +| Recursion.java:177:16:177:47 | directRecLocalFlow(...) : Boolean | Recursion.java:177:16:177:47 | directRecLocalFlow(...) : Boolean | provenance | | nodes -| Recursion.java:57:24:57:34 | readToken calls readToken | semmle.label | readToken calls readToken | -| Recursion.java:57:24:57:34 | readToken calls readToken : Token | semmle.label | readToken calls readToken : Token | -| Recursion.java:71:29:71:33 | bar calls foo | semmle.label | bar calls foo | -| Recursion.java:76:16:76:20 | foo calls bar | semmle.label | foo calls bar | -| Recursion.java:81:16:81:32 | directRecursive calls directRecursive | semmle.label | directRecursive calls directRecursive | -| Recursion.java:81:16:81:32 | directRecursive calls directRecursive : Boolean | semmle.label | directRecursive calls directRecursive : Boolean | -| Recursion.java:89:16:89:23 | level0 calls level1 | semmle.label | level0 calls level1 | -| Recursion.java:89:16:89:23 | level0 calls level1 : Boolean | semmle.label | level0 calls level1 : Boolean | -| Recursion.java:95:16:95:23 | level1 calls level2 : Boolean | semmle.label | level1 calls level2 : Boolean | -| Recursion.java:101:16:101:23 | level2 calls level0 : Boolean | semmle.label | level2 calls level0 : Boolean | -| Recursion.java:116:20:116:27 | level0 calls level1 | semmle.label | level0 calls level1 | -| Recursion.java:116:20:116:27 | level0 calls level1 : Boolean | semmle.label | level0 calls level1 : Boolean | -| Recursion.java:118:16:118:23 | level0 calls level2 | semmle.label | level0 calls level2 | -| Recursion.java:118:16:118:23 | level0 calls level2 : Boolean | semmle.label | level0 calls level2 : Boolean | -| Recursion.java:124:16:124:23 | level1 calls level2 | semmle.label | level1 calls level2 | -| Recursion.java:124:16:124:23 | level1 calls level2 : Boolean | semmle.label | level1 calls level2 : Boolean | -| Recursion.java:128:20:128:27 | level2 calls level1 | semmle.label | level2 calls level1 | -| Recursion.java:128:20:128:27 | level2 calls level1 : Boolean | semmle.label | level2 calls level1 : Boolean | -| Recursion.java:130:16:130:23 | level2 calls level0 | semmle.label | level2 calls level0 | -| Recursion.java:130:16:130:23 | level2 calls level0 : Boolean | semmle.label | level2 calls level0 : Boolean | -| Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth | semmle.label | directRecursiveNoDepth calls directRecursiveNoDepth | -| Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth : Boolean | semmle.label | directRecursiveNoDepth calls directRecursiveNoDepth : Boolean | -| Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow | semmle.label | directRecLocalFlow calls directRecLocalFlow | -| Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow : Boolean | semmle.label | directRecLocalFlow calls directRecLocalFlow : Boolean | +| Recursion.java:57:24:57:34 | readToken(...) | semmle.label | readToken(...) | +| Recursion.java:57:24:57:34 | readToken(...) : Token | semmle.label | readToken(...) : Token | +| Recursion.java:71:29:71:33 | foo(...) | semmle.label | foo(...) | +| Recursion.java:71:29:71:33 | foo(...) : Boolean | semmle.label | foo(...) : Boolean | +| Recursion.java:71:29:71:33 | foo(...) : Boolean | semmle.label | foo(...) : Boolean | +| Recursion.java:72:16:72:24 | fooResult : Boolean | semmle.label | fooResult : Boolean | +| Recursion.java:72:16:72:24 | fooResult : Boolean | semmle.label | fooResult : Boolean | +| Recursion.java:76:16:76:20 | bar(...) | semmle.label | bar(...) | +| Recursion.java:76:16:76:20 | bar(...) : Boolean | semmle.label | bar(...) : Boolean | +| Recursion.java:76:16:76:20 | bar(...) : Boolean | semmle.label | bar(...) : Boolean | +| Recursion.java:81:16:81:32 | directRecursive(...) | semmle.label | directRecursive(...) | +| Recursion.java:81:16:81:32 | directRecursive(...) : Boolean | semmle.label | directRecursive(...) : Boolean | +| Recursion.java:89:16:89:23 | level1(...) | semmle.label | level1(...) | +| Recursion.java:89:16:89:23 | level1(...) : Boolean | semmle.label | level1(...) : Boolean | +| Recursion.java:89:16:89:23 | level1(...) : Boolean | semmle.label | level1(...) : Boolean | +| Recursion.java:89:16:89:23 | level1(...) : Boolean | semmle.label | level1(...) : Boolean | +| Recursion.java:95:16:95:23 | level2(...) | semmle.label | level2(...) | +| Recursion.java:95:16:95:23 | level2(...) : Boolean | semmle.label | level2(...) : Boolean | +| Recursion.java:95:16:95:23 | level2(...) : Boolean | semmle.label | level2(...) : Boolean | +| Recursion.java:95:16:95:23 | level2(...) : Boolean | semmle.label | level2(...) : Boolean | +| Recursion.java:101:16:101:23 | level0(...) | semmle.label | level0(...) | +| Recursion.java:101:16:101:23 | level0(...) : Boolean | semmle.label | level0(...) : Boolean | +| Recursion.java:101:16:101:23 | level0(...) : Boolean | semmle.label | level0(...) : Boolean | +| Recursion.java:101:16:101:23 | level0(...) : Boolean | semmle.label | level0(...) : Boolean | +| Recursion.java:116:20:116:27 | level1(...) | semmle.label | level1(...) | +| Recursion.java:116:20:116:27 | level1(...) : Boolean | semmle.label | level1(...) : Boolean | +| Recursion.java:116:20:116:27 | level1(...) : Boolean | semmle.label | level1(...) : Boolean | +| Recursion.java:116:20:116:27 | level1(...) : Boolean | semmle.label | level1(...) : Boolean | +| Recursion.java:118:16:118:23 | level2(...) | semmle.label | level2(...) | +| Recursion.java:118:16:118:23 | level2(...) | semmle.label | level2(...) | +| Recursion.java:118:16:118:23 | level2(...) : Boolean | semmle.label | level2(...) : Boolean | +| Recursion.java:118:16:118:23 | level2(...) : Boolean | semmle.label | level2(...) : Boolean | +| Recursion.java:118:16:118:23 | level2(...) : Boolean | semmle.label | level2(...) : Boolean | +| Recursion.java:124:16:124:23 | level2(...) | semmle.label | level2(...) | +| Recursion.java:124:16:124:23 | level2(...) | semmle.label | level2(...) | +| Recursion.java:124:16:124:23 | level2(...) : Boolean | semmle.label | level2(...) : Boolean | +| Recursion.java:124:16:124:23 | level2(...) : Boolean | semmle.label | level2(...) : Boolean | +| Recursion.java:124:16:124:23 | level2(...) : Boolean | semmle.label | level2(...) : Boolean | +| Recursion.java:128:20:128:27 | level1(...) | semmle.label | level1(...) | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | semmle.label | level1(...) : Boolean | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | semmle.label | level1(...) : Boolean | +| Recursion.java:128:20:128:27 | level1(...) : Boolean | semmle.label | level1(...) : Boolean | +| Recursion.java:130:16:130:23 | level0(...) | semmle.label | level0(...) | +| Recursion.java:130:16:130:23 | level0(...) | semmle.label | level0(...) | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | semmle.label | level0(...) : Boolean | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | semmle.label | level0(...) : Boolean | +| Recursion.java:130:16:130:23 | level0(...) : Boolean | semmle.label | level0(...) : Boolean | +| Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) | semmle.label | directRecursiveNoDepth(...) | +| Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) : Boolean | semmle.label | directRecursiveNoDepth(...) : Boolean | +| Recursion.java:177:16:177:47 | directRecLocalFlow(...) | semmle.label | directRecLocalFlow(...) | +| Recursion.java:177:16:177:47 | directRecLocalFlow(...) : Boolean | semmle.label | directRecLocalFlow(...) : Boolean | subpaths #select -| Recursion.java:57:24:57:34 | readToken calls readToken | Recursion.java:57:24:57:34 | readToken calls readToken | Recursion.java:57:24:57:34 | readToken calls readToken | Found a recursion: | -| Recursion.java:57:24:57:34 | readToken calls readToken | Recursion.java:57:24:57:34 | readToken calls readToken : Token | Recursion.java:57:24:57:34 | readToken calls readToken | Found a recursion: | -| Recursion.java:71:29:71:33 | bar calls foo | Recursion.java:71:29:71:33 | bar calls foo | Recursion.java:71:29:71:33 | bar calls foo | Found a recursion: | -| Recursion.java:76:16:76:20 | foo calls bar | Recursion.java:76:16:76:20 | foo calls bar | Recursion.java:76:16:76:20 | foo calls bar | Found a recursion: | -| Recursion.java:81:16:81:32 | directRecursive calls directRecursive | Recursion.java:81:16:81:32 | directRecursive calls directRecursive | Recursion.java:81:16:81:32 | directRecursive calls directRecursive | Found a recursion: | -| Recursion.java:81:16:81:32 | directRecursive calls directRecursive | Recursion.java:81:16:81:32 | directRecursive calls directRecursive : Boolean | Recursion.java:81:16:81:32 | directRecursive calls directRecursive | Found a recursion: | -| Recursion.java:89:16:89:23 | level0 calls level1 | Recursion.java:101:16:101:23 | level2 calls level0 : Boolean | Recursion.java:89:16:89:23 | level0 calls level1 | Found a recursion: | -| Recursion.java:116:20:116:27 | level0 calls level1 | Recursion.java:128:20:128:27 | level2 calls level1 : Boolean | Recursion.java:116:20:116:27 | level0 calls level1 | Found a recursion: | -| Recursion.java:116:20:116:27 | level0 calls level1 | Recursion.java:130:16:130:23 | level2 calls level0 : Boolean | Recursion.java:116:20:116:27 | level0 calls level1 | Found a recursion: | -| Recursion.java:118:16:118:23 | level0 calls level2 | Recursion.java:118:16:118:23 | level0 calls level2 | Recursion.java:118:16:118:23 | level0 calls level2 | Found a recursion: | -| Recursion.java:124:16:124:23 | level1 calls level2 | Recursion.java:124:16:124:23 | level1 calls level2 | Recursion.java:124:16:124:23 | level1 calls level2 | Found a recursion: | -| Recursion.java:128:20:128:27 | level2 calls level1 | Recursion.java:128:20:128:27 | level2 calls level1 | Recursion.java:128:20:128:27 | level2 calls level1 | Found a recursion: | -| Recursion.java:128:20:128:27 | level2 calls level1 | Recursion.java:128:20:128:27 | level2 calls level1 : Boolean | Recursion.java:128:20:128:27 | level2 calls level1 | Found a recursion: | -| Recursion.java:128:20:128:27 | level2 calls level1 | Recursion.java:130:16:130:23 | level2 calls level0 : Boolean | Recursion.java:128:20:128:27 | level2 calls level1 | Found a recursion: | -| Recursion.java:130:16:130:23 | level2 calls level0 | Recursion.java:128:20:128:27 | level2 calls level1 : Boolean | Recursion.java:130:16:130:23 | level2 calls level0 | Found a recursion: | -| Recursion.java:130:16:130:23 | level2 calls level0 | Recursion.java:130:16:130:23 | level2 calls level0 | Recursion.java:130:16:130:23 | level2 calls level0 | Found a recursion: | -| Recursion.java:130:16:130:23 | level2 calls level0 | Recursion.java:130:16:130:23 | level2 calls level0 : Boolean | Recursion.java:130:16:130:23 | level2 calls level0 | Found a recursion: | -| Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth | Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth | Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth | Found a recursion: | -| Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth | Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth : Boolean | Recursion.java:148:16:148:54 | directRecursiveNoDepth calls directRecursiveNoDepth | Found a recursion: | -| Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow | Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow | Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow | Found a recursion: | -| Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow | Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow : Boolean | Recursion.java:177:16:177:47 | directRecLocalFlow calls directRecLocalFlow | Found a recursion: | +| Recursion.java:57:24:57:34 | readToken(...) | Recursion.java:57:24:57:34 | readToken(...) | Recursion.java:57:24:57:34 | readToken(...) | Found a recursion: | +| Recursion.java:57:24:57:34 | readToken(...) | Recursion.java:57:24:57:34 | readToken(...) : Token | Recursion.java:57:24:57:34 | readToken(...) | Found a recursion: | +| Recursion.java:71:29:71:33 | foo(...) | Recursion.java:76:16:76:20 | bar(...) : Boolean | Recursion.java:71:29:71:33 | foo(...) | Found a recursion: | +| Recursion.java:76:16:76:20 | bar(...) | Recursion.java:71:29:71:33 | foo(...) : Boolean | Recursion.java:76:16:76:20 | bar(...) | Found a recursion: | +| Recursion.java:81:16:81:32 | directRecursive(...) | Recursion.java:81:16:81:32 | directRecursive(...) | Recursion.java:81:16:81:32 | directRecursive(...) | Found a recursion: | +| Recursion.java:81:16:81:32 | directRecursive(...) | Recursion.java:81:16:81:32 | directRecursive(...) : Boolean | Recursion.java:81:16:81:32 | directRecursive(...) | Found a recursion: | +| Recursion.java:89:16:89:23 | level1(...) | Recursion.java:95:16:95:23 | level2(...) : Boolean | Recursion.java:89:16:89:23 | level1(...) | Found a recursion: | +| Recursion.java:95:16:95:23 | level2(...) | Recursion.java:101:16:101:23 | level0(...) : Boolean | Recursion.java:95:16:95:23 | level2(...) | Found a recursion: | +| Recursion.java:101:16:101:23 | level0(...) | Recursion.java:89:16:89:23 | level1(...) : Boolean | Recursion.java:101:16:101:23 | level0(...) | Found a recursion: | +| Recursion.java:116:20:116:27 | level1(...) | Recursion.java:118:16:118:23 | level2(...) : Boolean | Recursion.java:116:20:116:27 | level1(...) | Found a recursion: | +| Recursion.java:116:20:116:27 | level1(...) | Recursion.java:124:16:124:23 | level2(...) : Boolean | Recursion.java:116:20:116:27 | level1(...) | Found a recursion: | +| Recursion.java:118:16:118:23 | level2(...) | Recursion.java:116:20:116:27 | level1(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) | Found a recursion: | +| Recursion.java:118:16:118:23 | level2(...) | Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) | Found a recursion: | +| Recursion.java:118:16:118:23 | level2(...) | Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:118:16:118:23 | level2(...) | Found a recursion: | +| Recursion.java:124:16:124:23 | level2(...) | Recursion.java:116:20:116:27 | level1(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) | Found a recursion: | +| Recursion.java:124:16:124:23 | level2(...) | Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) | Found a recursion: | +| Recursion.java:124:16:124:23 | level2(...) | Recursion.java:130:16:130:23 | level0(...) : Boolean | Recursion.java:124:16:124:23 | level2(...) | Found a recursion: | +| Recursion.java:128:20:128:27 | level1(...) | Recursion.java:118:16:118:23 | level2(...) : Boolean | Recursion.java:128:20:128:27 | level1(...) | Found a recursion: | +| Recursion.java:128:20:128:27 | level1(...) | Recursion.java:124:16:124:23 | level2(...) : Boolean | Recursion.java:128:20:128:27 | level1(...) | Found a recursion: | +| Recursion.java:130:16:130:23 | level0(...) | Recursion.java:116:20:116:27 | level1(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) | Found a recursion: | +| Recursion.java:130:16:130:23 | level0(...) | Recursion.java:118:16:118:23 | level2(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) | Found a recursion: | +| Recursion.java:130:16:130:23 | level0(...) | Recursion.java:124:16:124:23 | level2(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) | Found a recursion: | +| Recursion.java:130:16:130:23 | level0(...) | Recursion.java:128:20:128:27 | level1(...) : Boolean | Recursion.java:130:16:130:23 | level0(...) | Found a recursion: | +| Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) | Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) | Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) | Found a recursion: | +| Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) | Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) : Boolean | Recursion.java:148:16:148:54 | directRecursiveNoDepth(...) | Found a recursion: | +| Recursion.java:177:16:177:47 | directRecLocalFlow(...) | Recursion.java:177:16:177:47 | directRecLocalFlow(...) | Recursion.java:177:16:177:47 | directRecLocalFlow(...) | Found a recursion: | +| Recursion.java:177:16:177:47 | directRecLocalFlow(...) | Recursion.java:177:16:177:47 | directRecLocalFlow(...) : Boolean | Recursion.java:177:16:177:47 | directRecLocalFlow(...) | Found a recursion: |